如何在ExpressJS中将数据从一个路由器传递到另一个路由器并进行更多?

时间:2016-10-30 10:25:43

标签: node.js mongodb express mongoose multer

我有以下代码:

router.use('/', function (req, res, next) {
  var token = req.headers['authorization'];
  jwt.verify(token, config.secret, function (err, decoded) {
    if (err) {
      return res.json({
        success: false,
        message: 'Failed to authenticate',
        error: err
      });
    } else {
      req.decoded = decoded;
    }
    next();
  });
})

var _storage = multer.diskStorage({
  destination: function (req, file, cb) {
    var dest = './express-server/uploads/users/'  + req.decoded.user._id;
    var stat = null;
    try {
      stat = fs.statSync(dest);
    }
    catch (err) {
      fs.mkdirSync(dest);
    }
    if (stat && !stat.isDirectory()) {
      throw new Error('Directory cannot be created because an inode of a different type exists at "' + dest + '"');
    }
    cb(null, dest )
  },
  filename: function (req, file, cb) {
    crypto.pseudoRandomBytes(2, function (err, raw) {
      cb(null, raw.toString('hex') + '.' + file.originalname.toLowerCase());
    });
  }
});  

var upload = multer({storage: _storage});
imageType = upload.single('fileUpload');

router.post('/upload', imageType, function (req, res, next) {
  console.log(req.file.path)  // this logs out the path
  res.send({success:true);
});

到目前为止,图像从前端上传并正确存储在文件系统中。

在这条路线下方,我有另一条路线:

router.post('/new', function ( req, res,  next) {
  var token = req.headers['authorization'];
  var decoded = jwt.decode(token);
  User.findById(decoded.user._id, function (err, doc) {
    if (err) {
      return res.status(404).json({
        title: 'An error occured',
        err: err
      });
    }

    var person = new Person({
      name: req.body.name,
      lastName: req.body.lastName,
      imageURL: **// how i can grab the uploaded file path inside this route from the upload route? Is this even possible?**,
      user: doc
    })

在此代码之后我将表单保存在Mongodb中没有任何问题,我只是无法获取文件名路径。

Person.save(function (err, newPerson) {
      if (err) {
        return res.status(404).json({
          title: 'An error occured',
          err: err
        });
      }
      doc.person.push(newPerson);
      doc.save();
      res.status(200).json({
        message: 'Person Saved!',
        obj: newPerson
      });
    });
  });
});

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

如果您的中间件或路由处理程序中有一个正常运行的映像保存步骤,最好的办法是将该上载文件的公共URL添加到用户对象以便以后保存。

我强烈反对建议将整个图像作为缓冲区存储在数据库中的方法。尽管可以做到这一点,但它会给您的服务器带来比从磁盘发送静态文件更多的负担,并且有静态文件处理(例如CDN)的低成本选项,您不会如果存储在数据库中,则可以使用。

答案 1 :(得分:-1)

无法获取使用当前设置上传的文件。

我会做什么,如果我是你,也是要保存用户在数据库中的上传。

router.post('/upload', imageType, function (req, res, next) {

  User.findById(req.decoded.user._id, function (err, doc) {
    if (err) { return res.status(500).send("Internal server error") }
    doc.file = req.file;
    doc.save( function( err ) { res.send( { success: true } ) }
  } );

});

然后在你的路线

router.post('/new', function ( req, res,  next) {
  var token = req.headers['authorization'];
  var decoded = jwt.decode(token);
  User.findById(decoded.user._id, function (err, doc) {
    if (err) {
      return res.status(404).json({
        title: 'An error occured',
        err: err
      });
    }

    var person = new Person({
      name: req.body.name,
      lastName: req.body.lastName,
      imageURL: doc.file.path
      user: doc
    });
} );