【问题标题】:nodejs mssql not returning data on PUTnodejs mssql没有在PUT上返回数据
【发布时间】:2026-01-05 12:10:01
【问题描述】:

我有以下场景:

user.js

const express        = require('express');
const bodyParser     = require('body-parser');
const app            = express();
const db             = require('./sql');    

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

app.post('/api/v1/users', async function (req, res) {
    res.json(await db.post_newUser(req.body));
});

sql.js

var connectionString = {
    user: 'user',
    password: 'password',
    server: 'server',
    database: 'db',
    options: {
        encrypt: false
    }
}
const sql = require('mssql');

module.exports = {
    post_newUser: async function(data) { 
        sql.connect(connectionString)
            .then(pool => {            
                return pool.request()
                           .input('name', sql.VarChar, data.name)
                           .input('mail', sql.VarChar, data.mail)
                           .execute('sp_post_newUser');
            })
            .then(result => {
                return JSON.parse(result);
            })
            .catch(err => {
                // ... error checks
            })        
    }
}

sp_post_newUser

CREATE PROCEDURE [dbo].[sp_post_newUser] 
    @name varchar(100),
    @mail varchar(100)
AS
BEGIN
    SET NOCOUNT ON;

    INSERT INTO [dbo].[users] ([name],[mail]) VALUES (@name, @mail)

    DECLARE @userProfile varchar(MAX)
    SET @userProfile = (SELECT * FROM users WHERE mail=@mail FOR JSON AUTO)

    SELECT [userProfile] = @userProfile;
END

注意:我简化了代码以保持简短。任何语法错误都应该被忽略。 :-)

我的存储过程将数据存储在数据库中。同时,它返回了一个应该由api返回的表,但它总是空白。

【问题讨论】:

  • 那是过于复杂的代码。如果要返回新条目,只需写SELECT * from users where ...,不要FOR JSON,不要给变量赋值。
  • 也试过了,但是api也没有返回结果
  • SQL 查询有效。如果代码中的某些内容没有,则代码需要修复,而不是查询。过于复杂的查询会带来问题,但并不能解决问题。数据库不返回 JSON,那么在您尝试将结果转换为 JSON 之前,原始代码是什么样的?
  • 我知道 SQL 查询有效。我的问题是关于 nodejs 代码的。
  • 原始查询可以返回多行,如果有多行相同的邮件。您可以在 INSERT 中使用OUTPUT clause 来返回新值,例如INSERT .... OUTPUT inserted.* VALUES (...)

标签: node.js sql-server


【解决方案1】:

我认为 post_newUser 函数有问题。该函数不返回数据。试试这样的代码

module.exports = {
    post_newUser: function(data) { 
        return sql.connect(connectionString)
        ...

或者在纯等待/异步上重写

module.exports = {
    post_newUser: async function(data) { 
        const pool = await sql.connect(connectionString);
        const result = await pool.request()
                       .input('name', sql.VarChar, data.name)
                       .input('mail', sql.VarChar, data.mail)
                       .execute('sp_post_newUser');
        return JSON.parse(result);
        ...

【讨论】:

  • 其他删除.catch(err => {}部分。异常必须到达res.json(await db.post_newUser(req.body));
  • 问题是result不是字符串,它包含recordsets,结果为rows
  • await/async 的第二个选项稍作调整:JSON.parse(JSON.stringify(data)) 这听起来很愚蠢,我会改进它,但至少我现在走对了。谢谢,@YaroslavGaponov!
  • 我认为JSON.parse(JSON.stringify(data)) 等于data
  • ...不是data,而是result