我使用Sequelize和Postgresql在Express服务器上创建了一个简单的端点。该端点应该接收一个简单的POST请求,其中JSON对象将Events注册为回调。问题是,这将是一个JSON对象,其中有很多字符串和数字,我无法为它们编写特定的模型。
我目前的模型有两个问题。
我只能接收指向Event.Event的事件,而实际上我想接收任何不应该像我在模型上写的那样以键"事件"开头的JSON。然而,我实际上不知道如何创建一个模型,允许我们将任何未指定的JSON发送到我的表Events。
如果我收到那些试图将JSON发布到此端点的回调,它们自然会显示为NULL,因为它们不适合Event.Event
这是型号:
const Sequelize = require('sequelize');
const sequelize = require('../db');
const Event = sequelize.define(
'Event',
{
event: {type: Sequelize.JSON, allowNull: false}
}
);
module.exports = Event;
路由器:
const { Router } = require("express");
const Event = require("./model");
const router = new Router();
router.get("/event-receiver", (req, res, next) => {
const limit = req.query.limit || 25;
const offset = req.query.offset || 0;
Event.findAll({ limit, offset })
.then(allEvents => res.json(allEvents))
.catch(next);
});
router.post("/event-receiver", (req, res, next) => {
Event.create(req.body)
.then(newEvent => res.status(201).json(newEvent))
.catch(next);
});
module.exports = router;
我的实际问题是,我如何编写一个模型来接受发送到该端点的任何类型的未指定JSON?
例如:
{
AnyRandomJSON: {type: Sequelize.JSON, allowNull: False}
}
实际上,不必给它起一个像"event"这样的名字,只需接收发送到"/event receiver"的任何东西,并在我的postgresql上注册一个名为Events或Data的特定列,诸如此类。
阅读文档和其他相关的帮助文章并不能启发我如何以简单的方式做到这一点。
我在从Yelp存储餐馆的JSON数据时遇到了类似的问题。虽然数据是JSON,但其结构并不相关。
为了避免不兼容(有些SQL引擎不支持JSON(,我最终将其存储为Sequelize.TEXT
:
restaurant_yelp_info: Sequelize.TEXT()
列的名称并不那么重要。
如果需要,我会在存储之前使用JSON.stringify()
转换为JSON。
检索后,我使用JOSN.parse()
将JSON转换为对象。
最后,我通过向Event.create()
添加一个Data来修复它。比我想象的要容易。
router.post("/signrequest-event-receiver", (req, res, next) => {
Event.create({
Data: req.body
})
.then(console.log(req.body))
.then((newEvent) => res.status(201).json(newEvent))
.catch(next);
});
使用JASONB 的我的模型
const Event = sequelize.define(
'Events',
{
Data:
{
type: Sequelize.JSONB,
}
}
);