Цепочка обещаний вместе со вставкой из БД
Я изо всех сил пытаюсь связать воедино три запроса, которые требуют синхронизации в node.js. Вот моя попытка использовать обещания, но я получаю сообщение об ошибке, в котором говорится, что db.run не является функцией. Первое действие должно вставить в мою базу данных sqlite. Самая важная вещь, которая мне нужна, - это переменная this.lastID, в которой указывается идентификатор последнего введенного элемента. Прежде чем пытаться использовать обещания, у меня были проблемы со сферой. Это важно, потому что мне нужно взять это значение и использовать его в моем объекте JSON под ключом обратного вызова. И наконец, я использую пакет npm для отправки запроса.
Я использую библиотеку обещаний Bluebird, пакет sqlite3 npm, nodejs, экспресс.
Любая помощь с этим будет потрясающей, потому что я потерялся.
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)
})
1 ответ
1-е правило "обещаний"... всегда возвращайте свои "обещания". За исключением случаев, когда вы создаете новый.
Попробуй это...
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}`);
});
Пример включает в себя довольно бесполезный, но наглядный пример того, как продолжить передачу данных по "цепочке обещаний".