#javascript #node.js #express
#javascript #node.js #выразить
Вопрос:
У меня есть экспресс-приложение, которое при вызове запроса get немедленно возвращает строковый токен, а затем запускает код python. Код python через некоторое время создает файл json, который мне нужно отправить в другом запросе post.
Этот код python может вызываться разными пользователями, поэтому мне нужно назначить им токен a сразу после вызова приложения. В запросе post я также буду изменять файл json, а затем отправлять его обратно
Я пытаюсь выполнить res.отправить токен, а затем res.перенаправить на запрос post, но я знаю, что это невозможно. Есть ли какой-либо другой способ, которым я мог бы отправить токен или перенаправить на запрос post?
app.get('/', (req, res) =>{
res.send(token())
runPython((code)=>{
*takes around 10 sec*
res.redirect('/post')}}
app.post('/post', (req, res)=>{
*do stuff to file*
res.sendFile()
Комментарии:
1. Не могли бы вы рассказать нам о том, почему вы пытаетесь это сделать? Тогда, возможно, мы могли бы помочь вам найти другое решение (чем то, что вы делаете сейчас).
2. @Take-Some-Bytes добавил немного больше деталей
3. Не лучше ли было бы просто связать обещания, а затем создать новый путь?
4. @Kimimomo Смогу ли я отправить токен, а затем отправить файл в том же запросе get?
5. Можете ли вы отправить токен и файл за один раз или для следующей функции нужен код или что-то в этом роде
Ответ №1:
Вы не можете отправить клиенту несколько ответов, разделенных по времени. Вы получаете ОДИН http-ответ. Итак, как только вы закончите res.send(token())
, этот http-запрос будет выполнен. Вы не можете отправлять больше данных как часть этого http-запроса.
Поскольку вы описываете вещи, вот некоторые из ваших вариантов:
-
Объединить оба в один ответ.Подождите отправки токена, пока не получите ответ python, а затем отправьте их оба в одном ответе JSON. Вы не сможете выполнить a
res.redirect()
, если вы также отправляете данные обратно. Итак, вы можете отправить местоположение перенаправления обратно в JSON и попросить клиента вручную выполнить перенаправление (просто установивwindow.location
новый URL-адрес). Предположительно, на стороне клиента в любом случае есть Javascript на принимающей стороне, поскольку какая-то форма кода в любом случае должна получать токен, чтобы сделать с ним что-то полезное. -
Используйте websocket / socket.соединение ввода-вывода для последующего обмена данными, инициируемого сервером.Попросите клиента подключить веб-сокет или сокет.подключение ввода-вывода. Затем вы можете ответить с помощью токена, а затем позже, когда python завершит работу, вы можете отправить дополнительные данные через websocket или сокет.подключение ввода-вывода. Для этого потребуется дополнительный код, чтобы иметь возможность связать конкретный веб-сокет / сокет.соединение ввода-вывода с клиентом, который отправил этот запрос, чтобы вы могли определить, какой веб-сокет / сокет.соединение ввода-вывода для этого запроса для отправки уведомления.
-
Опрос на стороне клиента для завершения операции python.Попросите сервер отправить обратно токен, а также отправить ему какой-то идентификатор запроса, а затем клиент может опрашивать сервер каждые несколько секунд, чтобы спросить сервер, выполнена ли эта операция python для этого идентификатора запроса. Когда он получает ответ от сервера о том, что python теперь завершен, клиент может вручную перенаправить себя
/post
, чтобы получить окончательные данные.