首页 > 解决方案 > Nodejs、GraphQl 和 SQLServer 返回空值

问题描述

我正在尝试使用我的 SQLServer 数据库连接 Node.js 并表达 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 Queries Example: 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')

标签: node.jssql-servergraphql

解决方案


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

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


推荐阅读