我正在努力尝试将需要同步的三个请求链接到node.js中。这是我尝试使用Promise的尝试,但是我收到一条错误消息,说db.run不是函数。第一个动作应该插入我的sqlite数据库中。我需要的最重要的是 this.lastID变量,它列出了最后一个被枚举的项目的ID。在尝试使用Promise之前,我在范围界定方面遇到了麻烦。这很重要,因为我需要获取此值并在回调键下的JSON对象中使用它。最后,我使用请求npm包发送请求。
我正在使用bluebird承诺库,sqlite3 npm软件包,nodejs,express。
任何帮助都会很棒,因为我迷路了。
function db() {
return new Promise(function(resolve, reject) {
db.run(`INSERT INTO scan_requests(name, date) VALUES(?,?);`, [name,date], function(err) {
if (err) {
console.log(err)
}
let q = this.lastID
resolve(q)
})
})
}
db()
.then(function(q) {
let options = {
url: 'API',
body: {
name: req.name,
scan_callback: `http://localhost:80/${q}`
},
json: true
}
resolve(options)
}).then(function(options) {
console.log(options)
})
答案 0 :(得分:0)
“承诺”的第一条规则...始终返回“承诺”。除非您创建一个新的。
尝试一下...
app.post('/route', function (req,res) {
new Promise(function(resolve, reject) {
db.run(`INSERT INTO scan_requests(req.name,req.date) VALUES(?,?);`, [name,date]).then(function(result) {
let options = {
url: 'http://API',
body: {
name: req.name,
date: req.date
callback: `http://localhost:80/${this.lastID}`,
},
json: true
}
// this resolves this promise ... it is now passed on
resolve(options);
}).then(function(options) {
// options is now the result from the promise
console.log(options)
request
.post(options)
.on('error', function(err) {
console.log(err)
})
.pipe(res)
});
});
});
更新(问题已修改)
您使用的是resolve(options)
,但是解决方法不在此范围内(不存在)。记住诺言的第一条规则...
db()
.then(function(q) {
let options = {
url: 'API',
body: {
name: req.name,
scan_callback: `http://localhost:80/${q}`
},
json: true
}
// *** change the following line ***
// --- you must return your data ---
return options;
}).then(function(options) {
console.log(options)
// -------------------------
// --- contrived example ---
// -------------------------
return { success: true };
}).then(status => {
console.log(`Success ${status.success}`);
});
该示例包括一个相当无用但说明性的示例,说明如何继续沿“承诺链”传递数据。