我刚开始学习Node.js,因此我仍然习惯于异步编程和回调。我正在尝试将记录插入MS SQL Server数据库中,并将新行的ID返回到我的视图中。
当打印到console.log时,mssql查询可以正常工作。我的问题是不知道如何正确返回数据。
这是我的mssql查询-在addJob.js中:
var config = require('../../db/config');
async function addJob(title) {
var sql = require('mssql');
const pool = new sql.ConnectionPool(config);
var conn = pool;
let sqlResult = '';
let jobID = '';
conn.connect().then(function () {
var req = new sql.Request(conn);
req.query(`INSERT INTO Jobs (Title, ActiveJD) VALUES ('${title}', 0) ; SELECT @@IDENTITY AS JobID`).then(function (result) {
jobID = result['recordset'][0]['JobID'];
conn.close();
//This prints the correct value
console.log('jobID: ' + jobID);
}).catch(function (err) {
console.log('Unable to add job: ' + err);
conn.close();
});
}).catch(function (err) {
console.log('Unable to connect to SQL: ' + err);
});
// This prints a blank
console.log('jobID second test: ' + jobID)
return jobID;
}
module.exports = addJob;
这是我的前端,模态框接收字符串并将其传递给上面的查询。然后,我希望它接收查询的返回值并重定向到另一个页面。
// ADD NEW JOB
$("#navButton_new").on(ace.click_event, function() {
bootbox.prompt("New Job Title", function(result) {
if (result != null) {
var job = {};
job.title = result;
$.ajax({
type: 'POST',
data: JSON.stringify(job),
contentType: 'application/json',
url: 'jds/addJob',
success: function(data) {
// this just prints that data is an object. Is that because I'm returning a promise? How would I unpack that here?
console.log('in success:' + data);
// I want to use the returned value here for a page redirect
//window.location.href = "jds/edit/?jobID=" + data;
return false;
},
error: function(err){
console.log('Unable to add job: ' + err);
}
});
} else {
}
});
});
最后是调用此功能的快速路由器代码:
const express = require('express');
//....
const app = express();
//....
app.post('/jds/addJob', function(req, res){
let dataJSON = JSON.stringify(req.body)
let parsedData = JSON.parse(dataJSON);
const addJob = require("../models/jds/addJob");
let statusResult = addJob(parsedData.title);
statusResult.then(result => {
res.send(req.body);
});
});
我一直在阅读诺言,试图弄清这里需要改变的地方,但是我没有运气。谁能提供任何提示?
答案 0 :(得分:0)
您实际上需要从函数中返回一个值,事情才能正常进行。由于嵌套了Promises,因此您需要在此处返回几个。 Promise的核心功能之一是,如果您返回Promise,则它会参与到调用Promise链中。
因此更改以下几行
jobID = result['recordset'][0]['JobID'];
到
return result['recordset'][0]['JobID']
和
req.query(`INSERT INTO Jobs (Title, ActiveJD) VALUES ('${title}', 0) ; SELECT @@IDENTITY AS JobID`).then(function (result) {
到
return req.query(`INSERT INTO Jobs (Title, ActiveJD) VALUES ('${title}', 0) ; SELECT @@IDENTITY AS JobID`).then(function (result) {
和
conn.connect().then(function () {
到
return conn.connect().then(function () {
您可能需要在返回后立即移动代码。将conn.close()
移到连接链末端的单个.finally
上也很方便。
我建议编写一个测试,直到正确为止,您可以使用它来进行测试。
const jobId = await addJob(...)
console.log(jobId)
或者重写代码以使用await代替.then()调用。