【问题标题】:Node: send data from middlware to function节点:将数据从中间件发送到函数
【发布时间】:2018-08-15 07:29:08
【问题描述】:

我正在使用 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));
        });
});

现在我使用另一个函数 fromHandler

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

【问题讨论】:

    标签: javascript node.js express middleware


    【解决方案1】:

    你在这里不需要承诺。中间件使用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));
            });
    });
    

    【讨论】:

    • 谢谢,您能否提供有关功能和中间件的所有上下文(如我放置的示例)?\
    • 我在代码上加了注释让大家知道。
    • 非常感谢,我结束了这个问题:),最后一个问题,假设我想验证我在 req 中得到的某个字段是否等于某物,如果不取消所有请求(就像我在表单数据中得到的令牌)我如何取消下一个函数的下一个?
    • 我的意思是如果fields.token != "123" 不处理fileHandler 函数...
    • 您只需要if (err) { return res.status(500).json(err) }。它会破裂并完成。 (错误或任何自定义比较)。
    猜你喜欢
    • 1970-01-01
    • 2015-07-10
    • 2022-01-03
    • 2021-08-22
    • 1970-01-01
    • 1970-01-01
    • 2019-09-07
    • 2020-06-24
    • 1970-01-01
    相关资源
    最近更新 更多