【问题标题】:How can I send multiple parameters from Angular HTTP Post to Nodejs backend to use in OracleDB query?如何将多个参数从 Angular HTTP Post 发送到 Nodejs 后端以用于 OracleDB 查询?
【发布时间】:2019-03-26 22:26:06
【问题描述】:

我的帖子成功了,我在 Angular 中收到了返回给我的数据,但由于某种原因,我无法传递值为“11”的“id”变量。我搜索了各种教程,在我看来,我的设置正确。

我在这里遗漏了一些简单的东西吗?我是新手,如果这很容易,请提前道歉。

Angular 页面组件

import { Component, OnInit } from '@angular/core';
import { Observable } from 'rxjs';
import { DBService, Group} from '../db.service';
import { HttpClient } from '@angular/common/http';
import { NgIf } from '@angular/common/src/directives/ng_if';
import { element } from 'protractor';
import { ActivatedRoute } from '@angular/router';
import { Router } from '@angular/router';


@Component({
  selector: 'app-flow',
  templateUrl: './flow.component.html',
  styleUrls: ['../css.css']
})
export class FlowComponent implements OnInit {

  groups: Group[];

  constructor(
    private auth: AuthenticationService,
    private dbService: DBService,
    private route: ActivatedRoute,
    private router: Router
  ) {}



  ngOnInit() {
   const id = 11;
    this.dbService.getGroup2(id).subscribe(groups => this.groups = groups);
  }

}

数据库服务代码

getGroup2(id): Observable<Group[]> {
 const url = 'http://localhost:4200/api/' + 'employees';
 const params = ({
id: id
 });
 return this._http.post(url, params)
 .pipe(
  map((res) => {
     console.log(res);
    return <Group[]> res;
  })
 );
 }

后端

services/router.js

const express = require('express');
const router = new express.Router();
const employees = require('../controllers/employees.js');

router.route('/employees/:id?')
  .post(employees.post);

module.exports = router;

服务/database.js

const oracledb = require('oracledb');
const dbConfig = require('../config/database.js');

async function initialize() {
  const pool = await oracledb.createPool(dbConfig.hrPool);
}

module.exports.initialize = initialize;

// close the function

async function close() {
    await oracledb.getPool().close();
  }
  
  module.exports.close = close;

// simple executre function

function simpleExecute(statement, binds = [], opts = {}) {
    return new Promise(async (resolve, reject) => {
      let conn;
  
      opts.outFormat = oracledb.OBJECT;
      opts.autoCommit = true;
  
      try {
        conn = await oracledb.getConnection();
  
        const result = await conn.execute(statement, binds, opts);
  
        resolve(result);
      } catch (err) {
        reject(err);
      } finally {
        if (conn) { // conn assignment worked, need to close
          try {
            await conn.close();
          } catch (err) {
            console.log(err);
          }
        }
      }
    });
  }
  
  module.exports.simpleExecute = simpleExecute;

controllers/employees.js

const employees = require('../db_apis/employees.js');

async function get(req, res, next) {
  try {
    const context = {};

  context.id = parseInt(req.params.id, 10);

    const rows = await employees.find(context);

    if (req.params.id) {
      if (rows.length === 1) {
        res.status(200).json(rows[0]);
      } else {
        res.status(404).end();
      }
    } else {
      res.status(200).json(rows);
    }
  } catch (err) {
    next(err);
  }
}

module.exports.get = get;

db_apis/employees.js

const database = require('../services/database.js');

const baseQuery = 
 `SELECT * FROM DB.EMPLOYEES`;

async function find(context) {
  let query = baseQuery;
  const binds = {};

   if (context.id) {
   binds.employee_id = context.id;

    query += `\nwhere employee_id = :employee_id`;
  }

  const result = await database.simpleExecute(baseQuery);
  
  console.log(result.rows);
  return result.rows;

}

module.exports.find = find;

请注意,我只是想让它适用于我上面代码中的 1 个变量的 ID。将来我将需要传递 多个 变量,例如日期、数字和 varchar 字符串。

任何帮助将不胜感激。

【问题讨论】:

    标签: javascript node.js angular http post


    【解决方案1】:

    而不是使用:

    req.params.id
    

    尝试使用:

    req.body['id']
    

    req.params用于从路由中获取参数

    【讨论】:

    • 我进行了更改并收到以下错误:express_1 | TypeError:无法读取未定义 express_1 的属性“id”|在帖子中 (/app/controllers/employees.js:7:36)
    • 我已经更新了代码,请尝试一下。如果它不起作用,请尝试打开浏览器检查元素,转到 Network 选项卡并查看发布请求是否正确发送正文。然后,尝试 console.log(req.body)
    • 当我对整个 req 进行控制台日志时,我看不到我的变量是否在任何地方。但是,在“网络”选项卡中,如果我查看员工呼叫,我确实会看到一个名为“请求有效负载”的部分,该部分具有 {id: 2}。这是我需要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-16
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多