Как запустить dat-узел как микро сервис?
ОБНОВЛЕНИЕ: добавлен полный код сервера. Обратите внимание, что маршрут для статического содержимого работает нормально, только тот, который связан с Dat, не работает. Также я запускаю узел 10.8.0
без транспортера или чего-либо еще, сервер запускается с micro -l tcp://0.0.0.0:$PORT
Я пытаюсь бежать dat-node
с Zeit micro
, У меня есть этот микро сервис
const { send } = require('micro')
const Dat = require('dat-node')
const handler = require('serve-handler')
const { router, get, post } = require('microrouter')
const static = async (request, response) => {
await handler(request, response, {
// static app folder
public: 'static',
// javascript header for es modules
headers: {
source: '**/*.mjs',
headers: [{
key: 'Content-Type',
value: 'text/javascript'
}]
},
// no directory listing
directoryListing: false
})
}
const createGame = (request, response) => {
Dat('./game', (err, dat) => {
if (err) throw err
let progress = dat.importFiles({watch: true})
progress.on('put', function (src, dest) {
console.log('Importing ', src.name, ' into archive')
})
dat.joinNetwork()
send(response, 200, { key: dat.key.toString('hex') })
})
}
const joinGame = (request, response) => {
}
module.exports = router(
post('/game', createGame),
post('/game/:game', joinGame),
get('/*', static)
)
Я просто хочу создать архив данных и вернуть открытый ключ, но когда я звоню send
Я получаю эту ошибку
(node:2054) UnhandledPromiseRejectionWarning: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at ServerResponse.setHeader (_http_outgoing.js:469:11)
at send (/home/ubuntu/workspace/node_modules/micro/lib/index.js:72:8)
at Dat (/home/ubuntu/workspace/index.js:35:5)
at /home/ubuntu/workspace/node_modules/dat-node/index.js:112:9
at apply (/home/ubuntu/workspace/node_modules/thunky/index.js:44:12)
at process._tickCallback (internal/process/next_tick.js:63:19)(node:2054) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)(node:2054) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
Итак, я не уверен, куда отправляется заголовок, может я просто неправильно обрабатываю обратный вызов Dat? не уверен, как реализовать этот сервис.
2 ответа
Похоже, проблема заключается в использовании micro
, не проблема с dat-node
, Когда вы выполняете асинхронную работу в микро, вам нужно использовать async/await
инструменты Javascript (обещания).
Вот фиксированный код:
const createGame = async (request, response) => {
var key = await new Promise((resolve) => {
Dat('./game', (err, dat) => {
if (err) throw err
let progress = dat.importFiles({watch: true})
progress.on('put', function (src, dest) {
console.log('Importing ', src.name, ' into archive')
})
dat.joinNetwork()
resolve(dat.key.toString('hex'))
})
})
console.log('sending')
send(response, 200, { key })
}
Фрагмент работает, если вы экспортируете функцию. Бежать с micro whatever.js
и curl to localhost:3000, который должен вернуть ключ.
const { send } = require('micro')
const Dat = require('dat-node')
module.exports = (request, response) => {
Dat('./game', async (err, dat) => {
if (err) throw err
let progress = dat.importFiles({watch: true})
progress.on('put', function (src, dest) {
console.log('Importing ', src.name, ' into archive')
})
dat.joinNetwork()
send(response, 200, { key: dat.key.toString('hex') })
})
}