2013-04-11 34 views
0

這是Node.JS代碼,它有兩部分。第一個是在主服務器上的文件:使用Node.JS下載文件的奇怪錯誤

app.get('/download/:photo', function (req, res){ 

    dbs.imagenschema.find({ _id: req.params.photo }, function (err, imagen){ 

    if (err) throw assert.ifError(err);; 

    var file = __dirname + '/public/users/' + imagen.auid + '/' + imagen.name; 

    var filename = path.basename(file); 
    var mimetype = mime.lookup(file); 

    res.setHeader('Content-disposition', 'attachment; filename=' + filename); 
    res.setHeader('Content-type', mimetype); 

    var filestream = fs.createReadStream(file); 
    filestream.pipe(res); 

    }); 

}); 

另一部分是dbs.imagenschema,但是這部分很簡單,它只是從dbs模塊導出的圖像模式。

這是德按鈕被點擊時,開始下載:

<a href="/download/<%= photo._id %>"> 
    <button class="btn btn-inverse"><i class="icon-download-alt icon-white"></i> Download</button> 
</a> 

但是,當我點擊它,我收到此錯誤:

TypeError: Cannot read property 'background' of null 
    at eval (eval at <anonymous> (/root/pixgalery/node_modules/ejs/lib/ejs.js:234:12), <anonymous>:30:4196) 
    at /root/pixgalery/node_modules/ejs/lib/ejs.js:239:15 
    at Object.exports.render (/root/pixgalery/node_modules/ejs/lib/ejs.js:277:13) 
    at View.exports.renderFile [as engine] (/root/pixgalery/node_modules/ejs/lib/ejs.js:303:22) 
    at View.render (/root/pixgalery/node_modules/express/lib/view.js:75:8) 
    at Function.app.render (/root/pixgalery/node_modules/express/lib/application.js:500:10) 
    at ServerResponse.res.render (/root/pixgalery/node_modules/express/lib/response.js:717:7) 
    at /root/pixgalery/app.js:181:15 
    at Promise.<anonymous> (/root/pixgalery/db.js:237:27) 
    at Promise.<anonymous> (/root/pixgalery/node_modules/mongoose/lib/promise.js:133:8) 

所以,我認爲是因爲這個:

app.get('/:user/:id', function (req, res){ 

    dbs.getimage(req.params.id, req.params.user, function (user, img, fav, comments){ 

    if (img.type == 'music') { 

     res.render('music.ejs', { 

      user: user, 
      photo: img, 
      req: req.session.user, 
      fav: fav, 
      comments: comments 

     }); 

    } else{ 

     res.render('photo.ejs', { 

      user: user, 
      photo: img, 
      req: req.session.user, 
      fav: fav, 
      comments: comments 

     }); 

    } 

    }); 

}); 

也許服務器認爲/download/fooid是一個請求我上面寫的代碼,因爲/download/fooid不會發送任何響應EJS文件,所以,不可能得到這樣的錯誤。任何解決方案?

謝謝先進!

回答

1

你必須確保/download/:photo路線是/:user/:id路線之前聲明,否則後者將比賽/download/fooid,以爲download是用戶參數和fooidid參數(與快遞,匹配時才能聲明:匹配請求的第一條路由將得到處理它)。

所以:

// first this... 
app.get('/download/:photo', ...); 

// ...and then this. 
app.get('/:user/:id', ...); 
+0

我想在我的VPS,然後,不能正常工作。但是在本地作品中 – MrMangado 2013-04-11 17:26:14

+0

你是直接訪問VPS上的節點,還是通過類似nginx的東西?也許有人在緩存最初的錯誤迴應? – robertklep 2013-04-11 17:31:44