Обещания, не выполняющие запрос T-SQL в узле js - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь написать в узле js функцию, которая будет запускать SQL-запрос, используя mssql, и возвращает обещание.По какой-то причине он попадает в строку

console.log("got to the run proc functions");

, но после этого не запускает никакого кода.Любая помощь в этом вопросе будет принята с благодарностью.

runProc: function (params) {  
    var sql = require("mssql");
    sql.Promise = require('promise');

    return new Promise((resolve, reject) => {
    var dbConfig = {
        server:"ip",
        database: "db",
        user:"user",
        password: "pw"
    }

    console.log("got to the run proc functions");

    var keys = Object.keys(params);

    sql.connect(dbConfig).then(pool => {
            console.log("got connected");
            const request = pool.request()

            for (var i = 0; i < keys.length; i++) {

                if (keys[i].substring(0,6)=="Common") {
                    request.input(keys[i],sql.Bit,params[keys[i]]);
                    console.log("set the bit parameters");
                }
                else {
                    request.input(keys[i],params[keys[i]]);
                    console.log("set the other parameters");
                }
            } 

            request.execute("storedprocedure")
            return request;
        }).then(result => {
                resolve(result)
        }).catch(err => {
                reject(Error(err))
        });

        sql.close();
    });
}

1 Ответ

0 голосов
/ 25 мая 2018

Посмотрите, куда вы звоните sql.close().то есть он вызывается раньше request=pool.request и т. д.!Итак, для начала это не получится.

Кроме того, вы возвращаете request (что не является обещанием), а не request.execute() (что является обещанием), поэтому обещание будет разрешено раньше execute завершение

И, наконец, нет необходимости заключать обещание в конструктор Promise (не то, что это нарушает ваш код, но в этом нет необходимости)

Учитывая все это, ваш код

runProc: function (params) {  
    var sql = require("mssql");
    sql.Promise = require('promise');

    // removed new Promise constructor as sql.connect already returns a promise we can chain to and return
    var dbConfig = {
        server:"ip",
        database: "db",
        user:"user",
        password: "pw"
    }

    console.log("got to the run proc functions");

    var keys = Object.keys(params);

    return sql.connect(dbConfig)
    .then(pool => {
        console.log("got connected");
        const request = pool.request()

        for (var i = 0; i < keys.length; i++) {

            if (keys[i].substring(0,6)=="Common") {
                request.input(keys[i],sql.Bit,params[keys[i]]);
                console.log("set the bit parameters");
            }
            else {
                request.input(keys[i],params[keys[i]]);
                console.log("set the other parameters");
            }
        } 
        // need to return the result of execute, not the request object
        return request.execute("storedprocedure")
    })
    .catch(err => throw new Error(err))
    // use Promise#finally - available in all good promise libraries
    .finally(sql.close); // sql.close AFTER we're done with it, not before
}

Использование новенького async / await сахара-обещания упрощает код еще больше

runProc: async function (params) {  
    var sql = require("mssql");
    sql.Promise = require('promise');

    var dbConfig = {
        server:"ip",
        database: "db",
        user:"user",
        password: "pw"
    }

    console.log("got to the run proc functions");

    var keys = Object.keys(params);
    try {
        const pool = await sql.connect(dbConfig);
        const request = pool.request();
        for (var i = 0; i < keys.length; i++) {

            if (keys[i].substring(0,6)=="Common") {
                request.input(keys[i],sql.Bit,params[keys[i]]);
                console.log("set the bit parameters");
            }
            else {
                request.input(keys[i],params[keys[i]]);
                console.log("set the other parameters");
            }
        } 
        // need to return the result of execute, not the request object
        return await request.execute("storedprocedure");
    } catch (err) {
        throw new Error(err);
    } finally {
        sql.close();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...