postgresql 如何将www.example.com的值req.body.name从app.js中的post路由传递到模块中的API端点,exports js文件

sxpgvts3  于 2023-05-17  发布在  PostgreSQL
关注(0)|答案(3)|浏览(94)

我使用node/express和EJS,沿着postgres数据库。
我的home.ejs文件中有3个输入,名为:标题平台流派
这些都包含在一个表单中,所以我可以创建一个帖子请求。
看起来像这样:

<h2>Add a Game:</h2>
  <form method="POST" action="/">
    <label for="title">Title:</label>
    <input type="text" id="title" name="title" required><br><br>
    <label for="platform">Platform:</label>
    <input type="text" id="platform" name="platform" required><br><br>
    <label for="genre">Genre:</label>
    <input type="text" id="genre" name="genre" required><br><br>
    <button type="submit">Add Game</button>        
  </div>

输入到这些输入中的值将作为post请求发送到我的服务器文件(app.js)

app.post('/', async (req, res) => {

// get the user's input from the form
const title = req.body.title;
const platform = req.body.platform;
const genre = req.body.genre;

然后将这些值赋给上述代码中的变量。
在这个post路由中,我试图将这些值传递到我的api.js文件中,该文件基本上是API的case语句,具有以下参数:
app,pool,user_id;
文件通过下面的行导入到我的app.js中:

const apiList = require('./routes/api_list');

使用下面的代码行,我将这些参数传递到API case语句中:

const result = await apiList(app, pool, 1, 'addNewGame', {title, genre, platform });

我所针对的特定API应该接受这些值并将它们插入到我的postgres数据库中。
我的部分API看起来像这样:

case 'addNewGame':
return new Promise(async (resolve, reject) => {
try {
  const {title, genre, platform } = req.body;
  const result = await pool.query('INSERT INTO schemaName,tableName(user_id, title, genre, 
  platform) VALUES ($1, $2, $3, $4)', [userId, title, genre, platform]);

  if (result.rowCount === 0) {
    reject('exists'); // Reject the promise with 'exists' if the game already exists
  } else {
    resolve('added'); // Resolve the promise with 'added' if the game is successfully added
  }

我的控制台记录了一个错误:
TypeError:无法解构“req.body”的属性“title”,因为它未定义。at fileLocation\routes\appList.js:75:14 at new Promise()
我尝试从请求数据对象中检索值,并确保我也将此对象作为app.js post route中的参数传递,但出现了相同的控制台错误,说requestData未定义。
注意事项:我已经让CRUD的“读”部分工作了,并且已经成功地将数据从我的DB发送到前端,因此在我的DB连接中没有错误。
我在app.js文件中声明了以下内容:

const bodyParser = require("body-parser");
app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json());

我被'Ivan'要求展示apiList case语句方法,见下文;

module.exports = function(app, pool, userId, functionName, req) {
switch (functionName) {
case: 'addGame':

任何帮助将不胜感激!

ajsxfq5m

ajsxfq5m1#

根据提供的信息,您的方法没有req输入参数。

module.exports = function(app, pool, userId, functionName) {
switch (functionName) {
case: 'addGame':

这就是错误所说的
参考错误:req未在folder_directory\routes\API_list.js:74:41中定义
为了解决这个问题,你需要修改你的方法签名:

module.exports = function(app, pool, userId, functionName, req) {
switch (functionName) {
case: 'addGame':

在我看来,你调用方法是正确的,因为你有5个输入参数:

const result = await apiList(app, pool, 1, 'addNewGame', {title, genre, platform });
lg40wkob

lg40wkob2#

我认为你还没有使用body parser包来解析来自API的post请求中的body在js文件的顶部添加下面的代码,以便它可以帮助你从post请求中阅读数据

const bodyParser = require('body-parser');
app.use(bodyParser.json()); 
app.use(bodyParser.raw());
utugiqy6

utugiqy63#

谢谢Ivan,你的回答让我找到了解决方案,我还需要在我的app.js帖子路由中更改以下代码:

const result = await apiList(app, pool, 1, 'addNewGame', {title, genre, platform 
});

对此:

const result = await apiList(app, pool, 1, 'addNewGame', req);

这解决了问题。

相关问题