基本上,无论我做什么,从我的gRPC服务器回调中返回的JSON对象都是空的。
大部分时间我都在按照这个教程进行操作,只是我使用的是SQLite3服务器而不是knex,并且我已经处理了listProducts方法。 我还没有尝试处理其他产品方法。
在server.js中,我从SQLite3数据库获取一些数据,并尝试在回调中返回它。 我还打印出来自数据库的数据以确认我确实获得了有效数据。
gRPC server.js
function listProducts(call, callback) {
console.log("******** Listed the products *********");
var data = "";
let db = new sqlite3.Database('../data/testDB.db', sqlite3.OPEN_READONLY, (err) => {
if(err){
console.error(err.message);
}
console.log("connected to DB");
});
db.serialize(() => {
db.get('SELECT NAME as name FROM PEEPS', (err, row) => {
if(err){
console.error(err.message);
}
console.log(row.name);
data.name = row.name;
});
});
db.close((err) => {
if(err) {
console.error(err.message);
}
console.log('closed db');
});
callback(null, { products: data.name });
}
来自 gRPC server.js 的输出
******** Listed the products *********
connected to DB
Jeff // Correct data from DB.
closed db
回调函数返回到调用它的client.js。然而,该对象始终为空。
如果取消注释res.json({ name: "jessie" });并注释掉res.json(result);,则代码将按预期工作;name: jessie将作为JSON对象发送到浏览器。
因此,这告诉我从客户端到浏览器数据被正确处理了。因此,问题出现在从server.js传递数据到client.js时。
gRPC client.js
// requirements
const path = require('path');
const protoLoader = require('@grpc/proto-loader');
const grpc = require('grpc');
// gRPC client
const productProtoPath = path.join(__dirname, '..', '..', 'protos', 'product.proto');
const productProtoDefinition = protoLoader.loadSync(productProtoPath);
const productPackageDefinition = grpc.loadPackageDefinition(productProtoDefinition).product;
const client = new productPackageDefinition.ProductService('localhost:50051', grpc.credentials.createInsecure());
// handlers
const listProducts = (req, res) => {
client.listProducts({}, (err, result) => {
console.log(result);
console.log(typeof result);
// console.log(res.json(result));
res.json(result);
// res.json({ name: "jessie" });
console.log("*******************");
});
};
Server listing on port 3000
{} //Oh no! An empty JSON object!
object
*******************
编辑 这里是我的仓库链接:https://github.com/burke212/grpc-node
data
设置为空字符串,然后将data.name
传递给回调函数。同时你还在其中启动了一些异步操作,但是你没有等待它们完成,因此它们对传递给回调函数的结果没有任何影响。为了理解我的意思,请尝试在调用回调函数之前或之后添加一个console.log
。 - murgatroid99client.listProducts(...)
。由于它是异步的,所以来自我的index.js中fetch
的父调用返回一个Promise {<state>: "pending"}
。因此,这使我相信我需要使client.listProducts()
成为同步。我走对了吗? - AdonisGRPC_VERBOSITY=DEBUG
了吗?我尝试过了,但是到目前为止没有成功。 - Yandry Pozo