【问题标题】:Nodejs, GraphQl and SQLServer return null valuesNodejs、GraphQl 和 SQLServer 返回空值
【发布时间】:2020-02-04 20:48:52
【问题描述】:

我正在尝试使用我的 SQLServer 数据库连接 Node.js 和 express web 服务。

我一直在测试,他们将正确的值返回到数据库,但问题是当我尝试从 Graphql 获取信息并将其转换为 JSON 时

JSON 会正确返回我需要的结构,但所有数据都为空值。

这是数据库配置:

const sql = require('mssql');

const config = {
user: 'user',
password: 'password',
server: 'server',
database: 'db',
options: {
  encrypt: true
}
};

这是 Graphql 调用的方法:

let getEmpleado = (id) => {
let datos = sql.connect(config, function(err){
   if (err) console.log(err);   

   let sqlQuery = 'SELECT Empleado, Nombre, Apellido1, Apellido2 FROM dbo.Empleados WHERE Empleado=' + id.id;
   let sqlRequest = new sql.Request();   

//console.log(sqlQuery);

    let datos1 = sqlRequest.query(sqlQuery, function(err, empleado){
        let datos2;
        if (err) console.log(err)
        datos = JSON.stringify(empleado.recordset[0]);
        sql.close();  
        console.log(datos);
    //return datos2; 
   });
   //return datos1;
  });
 return datos;
}

结果:

{
"data": {
  "empleado": {
  "Empleado": null,
  "Nombre": null,
  "Apellido1": null,
  "Apellido2": null
  }
 }
}

我对此很陌生,我需要一些帮助,因为我已经疯狂地寻找信息。

编辑 1:

调试函数后,我发现它的执行顺序对我来说不符合逻辑。

我再次输入代码,并用数字表示它执行的步骤。

let getEmpleado = (id) => {
 1- let datos = sql.connect(config, function(err){
   3- if (err) console.log(err);   

   4- let sqlQuery = 'SELECT Empleado, Nombre, Apellido1, Apellido2 FROM dbo.Empleados WHERE Empleado=' + id.id;
   5- let sqlRequest = new sql.Request();   

//console.log(sqlQuery);

    6- let datos1 = sqlRequest.query(sqlQuery, function(err, empleado){
        8- let datos2;
        9- if (err) console.log(err)
        10- datos = JSON.stringify(empleado.recordset[0]);
        11- sql.close();  
        12- console.log(datos);
    13- //return datos2; 
   });
   7- //return datos1;
  });
 2- return datos;
}

编辑 2:

正如 Daniel 所建议的,我检查了 mssql 文档并使用了 Promise 查询示例:Promises Queries Example

调试后,又出现了一些奇怪的函数执行顺序。

1- const sql = require('mssql')

2- sql.on('error', err => {
  // ... error handler
})

3- sql.connect(config).then(pool => {
// Query

6- return pool.request()
    .input('input_parameter', sql.Int, id.id)
    .query('SELECT Empleado, Nombre, Apellido1, Apellido2 FROM dbo.Empleados WHERE Empleado= @input_parameter')
4- }).then(result => {
    7- console.dir(result)
    8- return result.recordset[0]
}).catch(err => {
    // ... error checks
});

5- console.log('End')

【问题讨论】:

  • 和控制台记录好的数据?
  • 是的,控制台正确打印数据。当我调试函数时,ir似乎在连接到数据库之前返回值
  • 使用异步等待?
  • 不,正如我所说,我是 JavaScript 新手,我不知道操作系统到底发生了什么。
  • 在答案中添加了一些额外的细节。请检查我标记为欺骗的问题以获得更广泛的解释。

标签: node.js sql-server graphql


【解决方案1】:

没有必要使用stringify。您的解析器应该返回一个普通对象,其属性与返回类型的字段匹配。换句话说,返回empleado.recordset[0]就足够了。

每个解析器都会接收其父字段解析为的值作为第一个参数。如果您不提供客户解析器,则 GraphQL.js 中的默认行为是尝试返回与字段同名的父值的属性。换句话说,Nombre 字段的默认解析行为是返回parent.Nombre。如果父字段的解析器返回{ Nombre: 'Fernando' },则Nombre 字段将解析为"Fernando"。如果父字段的解析器返回一个字符串,Nombre 将解析为 null,因为字符串没有名为 Nombre 的属性。

【讨论】:

  • i 正如你所建议的,我已经更改了代码并只返回了employee.recordset [0],但我仍然遇到同样的问题。我添加了有关函数执行顺序的附加信息。
  • @Fernando 在使用 GraphQL 时,您还需要避免使用回调。您可以将 Promises 与 mssql 库一起使用——查看他们的文档。另见Common Scenario #6
  • 我已经编辑了这个问题,添加了带有承诺的代码和代码的执行顺序。
猜你喜欢
  • 1970-01-01
  • 2018-10-17
  • 2018-08-31
  • 2019-01-04
  • 2017-12-09
  • 1970-01-01
  • 2021-03-09
  • 1970-01-01
  • 2020-09-16
相关资源
最近更新 更多