【问题标题】:Calling stored procedure from node js从节点js调用存储过程
【发布时间】:2018-06-05 21:07:57
【问题描述】:

我正在使用 express,我正在尝试从 Azure 门户调用 LoginMember 存储过程。这是我的表格,取自 ejs:

<form method="post" action="/available-copies">
      <input type="text" placeholder="SSN" name="userssn">
      <input type="password" placeholder="Password" name="userpassword">
      <input type="submit" value="Login">
</form>

这是我的发帖请求

router.post('/available-copies', function (req, res) {
    var ssn = req.body.userssn;
    var password = req.body.userpassword;

    sql.connect(sqlConfig, function (err) {
        if (err) console.log(err);
        // create Request object
        var request = new sql.Request();
        // query to the database and execute procedure
        request.query("exec LoginMember @SSN='"+ssn+"', @PASSWORD='"+password+"';", function (err, recordset) {
            if (err) console.log(err);

            res.send(recordset);
        });
    });
    sql.close()
});

SqlConfig 来自另一个文件,这部分很好。以防万一,这是我的存储过程创建代码:

CREATE PROCEDURE LoginMember @SSN varchar(11), @PASSWORD char(64)
AS
BEGIN
   Select * from Member
   WHERE Member.ssn = @SSN AND Member.password = @PASSWORD
END

会发生什么 - 当我提交表单时,页面会持续加载 3-5 分钟,然后我得到 ​​p>

This page isn’t working
localhost didn’t send any data.

控制台不返回任何其他错误。 我知道这可能不是我可以使用的最佳解决方案,但这是我的方法,我想让它发挥作用。

【问题讨论】:

    标签: sql-server node.js express stored-procedures ejs


    【解决方案1】:

    确保您在查询执行或失败后关闭 sql 连接。我在您的代码中发现您正在关闭 sql.connect 外部的 sql 连接,这是不正确的,因为节点 js 本质上是异步的,这会在完成之前终止您的连接.请在下面找到更新代码:

    router.post('/available-copies', function (req, res) {
    var ssn = req.body.userssn;
    var password = req.body.userpassword;
    
    sql.connect(sqlConfig, function (err) {
        if (err) console.log(err);
        // create Request object
        var request = new sql.Request();
        // query to the database and execute procedure 
        let query = "exec LoginMember @SSN='" + ssn + "', @PASSWORD='" + password + "';";
        console.log(query)
        request.query(query, function (err, recordset) {
            if (err) {
                console.log(err);
                sql.close();
            }
            sql.close();
            res.send(recordset);
    
        });
      });
    });
    

    希望对你有帮助。

    【讨论】:

    • 谢谢,这似乎可行,所以我想我的问题是我在不正确的地方关闭了连接?
    • 是的,无论成功还是失败,总是在执行函数内部关闭或释放连接
    • 一个更快的问题,有没有办法 console.log() 我正在传递的整个查询?查看实际发送到 sql server 的内容?
    • 只需将您在 request.query 中传递的查询字符串设置为变量并记录该变量并将其传递给 request.query 例如: let query = "exec LoginMember @SSN='" + ssn + "', @PASSWORD='" + 密码 + "';";控制台.log(查询); request.query(query, function (err, recordset) {
    猜你喜欢
    • 2018-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多