我正在使用 hapi.js 和 mongodb 创建一个 node.js api 服务器,但在 Amazon EC2 上运行时遇到了一些问题。在本地运行它可以工作,但如果我在 EC2 实例上运行它,我会收到错误TypeError: Cannot read property 'statusCode' of null
完整的堆栈跟踪如下:
TypeError: Cannot read property 'statusCode' of null
at Request._finalize (/home/ec2-user/backend/node_modules/@hapi/hapi/lib/request.js:497:31)
at Request._reply (/home/ec2-user/backend/node_modules/@hapi/hapi/lib/request.js:434:18)
at Request._execute (/home/ec2-user/backend/node_modules/@hapi/hapi/lib/request.js:280:14)
at processTicksAndRejections (node:internal/process/task_queues:93:5)
Run Code Online (Sandbox Code Playgroud)
奇怪的部分是 GET 请求正在工作,而 PUT、POST 和 DELETE 正在抛出上述错误。我已经设置 server.js 如下:
...
const init = async () => {
const server = Hapi.server({
port: 3000,
});
//server.route(routes);
server.route([
{
method: "GET",
path: "/test",
handler: async (request, h) => {
return "workin GET"; …Run Code Online (Sandbox Code Playgroud) 我有一个 api,在过去的开发中,它会接收逗号分隔的字符串作为有效输入,并使用以下内容作为验证器:
Joi.string()
但现在我想使用这里提到的字符串数组实现相同的变量https://github.com/glennjones/hapi-swagger/issues/119。所以新的检查将是:
Joi.array().items(Joi.string())
但我不想破坏代码的向后兼容性。有没有办法检查变量的两个条件?
我是 Joi 的新手,所以任何帮助或指导将不胜感激。提前致谢。
我有两个文件,一个是 api.js,另一个是 handler.js。对于模式处理,我正在使用庆祝模块 @hapi/joi
在 api.js 上我只写了 API 名称
在 handler.js 上,我编写了 API 功能。
api.js
//JOI Schema Validator Middleware.
router.use(celebrate({
body: Joi.object().keys({
post: Joi.string().max(10),
userid: Joi.string(),
})
}));
const handler = require('./handler');
router.post('/createpost', handler.createPost);
router.use(errors());
module.exports = router;
Run Code Online (Sandbox Code Playgroud)
通过这个,如果发生错误,那么我得到了这样的响应
{"statusCode":400,"error":"Bad Request","message":"child \"post\" fails because [\"post\" length must be less than or equal to 10 characters long]","validation":{"source":"body","keys":["post"]}}
我只想将此错误转换为我自己的格式错误,即像这样
{error: true, status: 500, message: 'validation error', version: x.x.2}
Run Code Online (Sandbox Code Playgroud)
默认的 joi 错误是通过router.use(errors());这个模块生成的。我如何修改这个?任何帮助或建议都非常感谢。
joi.string().valid(['foo', 'bar'])已被弃用。
错误:方法不再接受数组参数:允许
实现这一目标的新方法是什么?
我正在寻求有关如何将包含多个资源的包发布到 HAPI 服务器的帮助。我正在运行 [测试服务器][1],并且我尝试使用 Jetty 服务器并将其作为 Docker 容器运行。我能够成功启动服务器,转到 UI 并直接发布患者。我还可以直接从 Postman 中发布患者:
POST /hapi-fhir-jpaserver/fhir/Patient HTTP/1.1
Host: localhost:8080
Content-Type: application/fhir+json
{
"resourceType": "Patient",
"name": [
{
"use": "official",
"family": "Solo",
"given": [
"Han"
]
}
]
Run Code Online (Sandbox Code Playgroud)
这一切都很好。但是,当我尝试发布此内容时:
{
"resourceType": "Bundle",
"type": "transaction",
"entry": [
{
"resource": {
"resourceType": "Patient",
"name": [
{
"use": "official",
"family": "Stark",
"given": [
"Anthony"
]
}
]
},
"request": {
"method": "PUT",
"url": "Patient"
}
}
]
}
Run Code Online (Sandbox Code Playgroud)
我收到“OperationOutcome”错误:“无法在此服务器上存储 Bundle 资源,其 Bundle.type 值为:事务”
我从 Web UI …
使用 GET 方法的路由有效,但使用 POST 方法的路由无效。邮递员继续奔跑,没有回复。
这是我尝试过的,
import * as hapi from "@hapi/hapi";
const init = async () => {
const server: hapi.Server = new hapi.Server({
port: 3000,
host: 'localhost'
});
server.route({
method: 'POST', // if you change it to GET, it works
path: '/test',
handler: function (request, h) {
const payload = { username: 'testUserNames'};
return payload.username;
}
});
await server.start();
console.log('Server running on %s', server.info.uri);
}
process.on('unhandledRejection', (err) => {
console.log(err);
process.exit(1);
});
init();Run Code Online (Sandbox Code Playgroud)
可能是什么问题?我哪里错了?
我注意到大多数(如果不是全部)三种资源类型都有一个属性'identifier',它是标识符类型。
我将其设置为具有系统和值的资源,我想知道现在如何搜索具有给定标识符的资源?
理想情况下,我想搜索具有给定标识符的所有类型的所有资源,但是我认为没有一种简单的方法可以指定可在所有类型中进行搜索的url,例如,我有一个患者资源,其标识符为系统:www.mydomain.com值:1,我想找到它们。我的服务器是hapi dstu2实例。
我有一个在 node v6.12.0 中运行的 node js 项目,我需要将项目更新到 node v12.18。
这些是 package.json 中标记到项目的一些依赖项:
{
"hapi": "^8.8.0"
"joi": "^6.4.1"
"mocha": "^2.4.5"
"ioredis": "^2.4.0"
}
Run Code Online (Sandbox Code Playgroud)
想知道我应该执行哪些步骤才能使此升级成为可能!
如果我升级到 node v12,代码功能会中断吗?它是否向后兼容节点 v6?所有这些Promise.then(function())仍然可以在 node v12 中工作吗?