Как использовать отправку форм через Интернет наряду с gRPC-связью?

#javascript #node.js #express #asynchronous #request

Вопрос:

Что я пытаюсь сделать: У меня есть приложение Node.js/Python, предназначенное для практики gRPC. Клиент узла предназначен для предоставления веб-интерфейса пользователям для ввода строки и номера. Исходя из этого, клиент передает эти аргументы серверу Python для обработки и возврата некоторой переменной.

Что я сделал: У меня связь между клиентом и сервером работает отлично, когда она реализована через интерфейс командной строки. У меня также есть служба интерфейса, которая отлично работает и в изоляции. Однако у меня возникают трудности с сочетанием обеих концепций.

Мой код:

 // 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(); 

Что происходит не так:
Из того, что я наблюдаю, происходит одно из двух. веб-интерфейс немедленно возвращает некоторые пустые значения для запроса, поскольку я предполагаю, что он прослушивает один раз, прежде чем какие-либо пользователи смогут взаимодействовать с веб-презентацией, захватывает запрос (пустой) и возвращается в main. Или main не ждет, пока интерфейс должным образом обработает то, что ему нужно, и продолжает обработку и пустой запрос.

Примечание: Я не уверен, как остановить интерфейс, чтобы дождаться завершения внутренних процессов. Поток, который я хотел бы, чтобы это произошло: запускается интерфейс -> пользователь вводит переменные в веб-формы — > > main затем использует эти значения для отправки в серверную часть — > > > после обработки серверная часть отправляет ответ в main — > > > > интерфейс распознает этот ответ и представляет новую информацию пользователю через другое веб-перенаправление.

Ответ №1:

Ну, вы можете использовать подсказку, вы можете это сделать

пусть Var1 = приглашение(«Текст приглашения здесь») это позволяет вам ввести приглашение.Что это делает, так это сохраняет информацию в переменной. Затем вы можете попросить что-нибудь взять эту информацию и использовать ее в другом месте. Если бы я создал веб-сайт для генерации случайного числа с вводом пользователем максимального значения, я мог бы сделать что-то вроде этого

 function random(max) {
return Math.Floor(Math.Random() * max)
}

let userNumber = prompt("Enter max here")

console.log(random(userNumber));
 

Очевидно, вы бы сделали что-то другое, кроме консоли.лог, но концепция та же самая.