javascript - 如何在 gRPC 通信的同时利用 Web 上的表单提交?
问题描述
我想做的事: 我有一个用于练习 gRPC 的 Node.js/Python 应用程序。Node 客户端旨在为用户提供一个 Web 前端来输入字符串和数字。由此,客户端将这些参数传递给 Python 服务器以处理并返回一些变量。
我所做的: 当通过 CLI 实现时,我的客户端-服务器通信工作得非常好。我也让前端服务在隔离时也能正常工作。但是,我在结合这两个概念时遇到了困难。
我的代码:
// Frontend for web presentation
async function frontend(query){
const app = express();
app.use(express.urlencoded({ extended: true }));
app.use(express.json());
app.set('view engine', 'pug');
app.get('/', (req, res) => {
res.render('index');
});
app.post("/submit", (req, res) => {
query.word = req.body.word;
query.mincount = req.body.mincount;
res.redirect('/');
return query;
});
app.listen(3000);
}
// Caller for gRPC
async function main(){
// ...
var func;
var query = {};
await frontend(query);
console.log(query);
// Some options for loading .proto file
const options = {
keepCase: true,
longs: String,
enums: String,
defaults: true,
oneofs: true,
};
// Load the .proto file
const packageDefinition = protoLoader.loadSync(PROTO_PATH, options);
// Load the proto package 'proto.keysearch' into variable
// This allows keysearchProto to recognize all of the definitions in the .proto file
const keysearchProto = grpc.loadPackageDefinition(packageDefinition).proto.keysearch;
// Create the client stub
// This allows us to call the 'Whohas' function defined in the 'KeywordSearch' service
// Additionally, send requests to port
const client = new keysearchProto.KeywordSearch(SOCKET, grpc.credentials.createInsecure());
// Finally, call the function
client[func](query, (err, response) => {
console.log(response.Results);
process.exit(0);
});
};
//frontend();
main();
出了什么问题: 根据我的观察,发生了两种情况之一。前端立即返回一些空值进行查询,因为我假设它在任何用户可以与 Web 演示交互之前侦听一次,捕获请求(空)并返回到 main。或者 main 没有等待前端正确处理它需要做的事情并继续处理和空查询。
旁注: 我不确定如何停止前端以等待后端进程完成。我希望发生的流程是:前端启动->用户将变量输入到Web表单中->主然后利用这些值发送到后端->处理后,后端向主发送响应->前端识别此响应并通过另一个网络重定向将新信息呈现给用户。
解决方案
那么你可以使用提示你可以做到这一点
let Var1 = prompt("Prompt text here") 这可以让您提示它的作用是将信息存储在变量中。然后,您可以让某些东西获取该信息并在其他地方使用它。如果我创建了一个网站来生成一个随机数,用户输入最大值,我可以做这样的事情
function random(max) {
return Math.Floor(Math.Random() * max)
}
let userNumber = prompt("Enter max here")
console.log(random(userNumber));
显然你会做一些除了 console.log 之外的事情,但概念是一样的。
推荐阅读
- angular - 为什么 DomSanitizer 不适用于字符串值?
- nginx - Nginx HTTPS SSL 重定向在 Ubuntu 18.04 中不起作用
- regex - 如何在记事本++中删除两个字符之间的文本
- php - Libsodium 解密返回空响应
- wordpress - 在主干上维护插件自定义
- javascript - V8 中的数组方法是用 C++、Torque 编写的,还是 JS 在运行时转换为机器码?
- yocto - Yocto Warrior 无法为 root 或其他用户设置密码
- linux - Yocto 将第三个系统服务添加到配方文件导致其他人无法启动
- string - 如何遍历字符串列表并在 Kotlin 中连接它们?
- javascript - Javascript拆分HTML属性和值