节点:从中间件发送数据到功能

时间:2018-08-15 07:29:09

标签: javascript node.js express middleware

我正在使用Express,我需要创建一些用于验证的中间件,

我喜欢

代码

app.use(‘/upload', fromData)
app.use(‘/upload', function firstUpload(req, res, next) {
    return fileHandler(req, res, next)
        .then((status) => {
            res.statusCode = 201;
            res.end(status)
        }).catch((err) => {
            return next(new appError(500, err));
        });
});

现在我使用来自Handler的另一个函数

function formData(req) {

 return new Promise((resolve, reject) => {
 const form = new formidable.IncomingForm();
  form.maxFileSize = 100 * 1024 * 1024;
  form.keepExtensions = true;
  form.multiEntry = true;
  form.parse(req, (err, fields, files) => {
    const filesInfo = Object.keys(files).map((key) => {
        const file = files[key];
        const filePath = file.path;
        const fileExt = path.extname(file.name);
        const fileName = path.basename(file.name, fileExt);
        return {filePath, fileExt};
    });
 }
  Resolve(filesInfo)
}

我需要从formData函数返回数据Resolve(filesInfo)fileHandler函数,我该怎么做? fileHandler函数需要获取filesInfo

1 个答案:

答案 0 :(得分:2)

您在这里不需要承诺。中间件使用next函数作为callback转到下一个处理程序。在此之前,您应该将来自中间件的数据放入req对象。之后,您可以从req. filesInfo获取。

function formData(req, res, next) {
  const form = new formidable.IncomingForm();
  form.maxFileSize = 100 * 1024 * 1024;
  form.keepExtensions = true;
  form.multiEntry = true;
  form.parse(req, (err, fields, files) => {
    if (err || fields.length === 0) {
       res.status(500).json({ message: 'you are done' }); // <- this is where you stop the request with an error.
    }
    const filesInfo = Object.keys(files).map((key) => {
        const file = files[key];
        const filePath = file.path;
        const fileExt = path.extname(file.name);
        const fileName = path.basename(file.name, fileExt);
        return {filePath, fileExt};
    });
    req.filesInfo = filesInfo;
    next();
  }
}

function fileHandler(req, res) {
  console.log(req.filesInfo); /* <- you can also get the filesInfo here */ 
  return Promise.resolve({});
}

app.use(‘/upload', fromData)
app.use(‘/upload', function(req, res, next) {
    // console.log(req.filesInfo); => You can get your filesInfo here and do whatever you want
    return fileHandler(req, res, next)
        .then((status) => {
            res.statusCode = 201;
            res.end(status)
        }).catch((err) => {
            return next(new appError(500, err));
        });
});