首页 > 解决方案 > 如何在 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表单中->主然后利用这些值发送到后端->处理后,后端向主发送响应->前端识别此响应并通过另一个网络重定向将新信息呈现给用户。

标签: javascriptnode.jsexpressasynchronousrequest

解决方案


那么你可以使用提示你可以做到这一点

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 之外的事情,但概念是一样的。


推荐阅读