Node.js MSSQL将查询结果返回给Ajax

时间:2019-06-07 21:21:29

标签: javascript node.js

我刚开始学习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);
    });  
});

我一直在阅读诺言,试图弄清这里需要改变的地方,但是我没有运气。谁能提供任何提示?

1 个答案:

答案 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()调用。