Express中间件执行顺序不正确

时间:2019-04-28 03:58:59

标签: node.js express

我将2个中间件一个接一个地放置,但是第二个中间件总是console.logs在第一个中间件之前。

我尝试了async / await和.then,但都没有为我工作。我认为这与我的第一个中间件中的API调用有关。

app.use('/studies', function (req, res, next) {
    new Airtable({ apiKey: process.env.API_KEY }).base(process.env.BASE)('study').select({
        fields: ['title', 'image', 'keywords', 'affiliation'],
        view: 'default',
    }).firstPage((err, records) => {
        if (err) {
            res.json(err); return
        }

        console.log('first log');
        res.locals.studyObject = records;
    });
    next();
}) 

app.use('/studies', function (req, res) {  
    console.log('second log');          
    res.json(res.locals.studyObject);
})      

我的console.log看起来像这样:

[nodemon] restarting due to changes...
[nodemon] starting `node server.js`
listening on port 5000
second log
first log    

2 个答案:

答案 0 :(得分:0)

这是因为在第一个中间,您正在调用异步函数,并且正在登录回调函数。如果要在执行回调后将处理程序传递给下一个中间件,请在回调内部移动next()

尝试一下

app.use('/studies', function (req, res, next) {
    new Airtable({ apiKey: process.env.API_KEY }).base(process.env.BASE)('study').select({
        fields: ['title', 'image', 'keywords', 'affiliation'],
        view: 'default',
    }).firstPage((err, records) => {
        if (err) {
            res.json(err); return
        }

        console.log('first log');
        res.locals.studyObject = records;
        next();
    });
}) 

答案 1 :(得分:0)

app.use('/studies', (req, res, next) => {
  new Airtable({apiKey: process.env.API_KEY}).base(process.env.BASE)('study').select({          
        fields: ['title', 'image', 'keywords', 'affiliation'], 
        view: 'default', 
        }).firstPage(function (err, records) {
            if (err) return res.json(err);
            return res.json(res.locals.studyObject);
        }
});