我将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
答案 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);
}
});