NodeJS + Express. Я пытаюсь добиться следующего:
- клиент отправляет по почте запрос со следующим JSON документом
data={text: "I love Stackoverflow", shouldPreprocess: <true or false>}
; - Мне нужно вызвать внешнюю службу WebSocket, чтобы настроиться анализ текста и возврат результата в виде JSON, например, {sentiment: 'positive'};
- Однако, если shouldPreprocess имеет значение true, я должен вызвать другую службу предварительной обработки раньше;
Вопросы:
- Я не уверен, что правильный способ сделать это, но вот две попытки. Я чувствую, что они оба взломаны.
- Я не уверен, как обращаться с неверным вводом от клиента. Подробности ниже.
router.post('/analyse', function (req, res, next) {
const data = req.body;
if (typeof data.text === 'undefined' || typeof data.shouldPreprocess === 'undefined') {
return next(new Error('Please provide text and flag'));
}
analyseSentiment(data.text, data.shouldPreprocess)
.then(doc => res.json(doc))
.catch(err => next(err));
});
function analyseSentiment(text, shouldPreprocess) {
let promise;
if (shouldPreprocess === true) {
textP = preprocess(text);
} else promise = new Promise((res, req) => res(text));
return textP
.then(text => axios.post(<URL to sentiment analyser>, text))
function preprocess(text) {
const ws = WebSocket(<URL of preprocessor>);
// But what if I wanted to check for some property of text here and throw an error
// that gets sent to the client, just as I do in the main function, i.e. in router.post above?
ws.on('open', () => ws.send(text));
return new Promise((res, rej) => ws.on('message', preprocText => res(preprocText)));
}
Итак, это первый способ. Это кажется хакерским, потому что я создаю бесполезное обещание в analyseSentiment, которое просто возвращает текст, так что у меня есть унифицированный способ работы как со сценарием предварительной обработки, так и без предварительной обработки ios. Также смотрите вопрос в комментарии в функции preprocess
выше.
Второй способ - сделать все в router.post
, то есть что-то вроде:
router.post('/analyse', function (req, res, next) {
const data = req.body;
if (typeof data.text === 'undefined' || typeof data.shouldPreprocess === 'undefined') {
return next(new Error('Please provide text and flag'));
}
if (data.shouldPreprocess) {
preprocess(data.text)
.then(text => axios.post(<URL to sentiment analyser>, text)))
.then(doc => res.json(doc))
.catch(err => next(err));
} else {
axios.post(<URL to sentiment analyser>, text)
.then(doc => res.json(doc))
.catch(err => next(err));
}
});
Но, конечно, нет фрагмент дублированного кода
Спасибо!