Node.js 快速路由器无法处理post请求?

Node.js 快速路由器无法处理post请求?,node.js,angular,http,express,Node.js,Angular,Http,Express,我正在使用angular cli和webpack,并使用以下package.json配置: "dependencies": { "@angular/common": "^4.0.0", "@angular/compiler": "^4.0.0", "@angular/core": "^4.0.0", "@angular/forms": "^4.0.0", "@angular/http": "^4.0.0", "@angular/platform-b

我正在使用angular cli和webpack,并使用以下package.json配置:

"dependencies": {
    "@angular/common": "^4.0.0",
    "@angular/compiler": "^4.0.0",
    "@angular/core": "^4.0.0",
    "@angular/forms": "^4.0.0",
    "@angular/http": "^4.0.0",
    "@angular/platform-browser": "^4.0.0",
    "@angular/platform-browser-dynamic": "^4.0.0",
    "@angular/router": "^4.0.0",
    "bcrypt-nodejs": "0.0.3",
    "body-parser": "^1.17.2",
    "core-js": "^2.4.1",
    "express": "^4.15.3",
    "express-session": "^1.15.4",
    "mongoose": "^4.11.3",
    "rxjs": "^5.1.0",
    "zone.js": "^0.8.4"
} 
下面是我的根文件夹结构:

我正在学习Angular2的意思。我的server.js中有以下代码

const express = require('express');
const path = require('path');
const http = require('http');
const bodyParser = require('body-parser');
const mongoose = require('mongoose');
const session = require('express-session');
mongoose.connect("mongodb://localhost/demo");

const api = require('../server/routes/api');

const app = express();
app.use(session({
    secret: 'somesecrettokenhere',
    name: 'demo',
    resave: false,
    saveUninitialized: true
}));

// Parsers for POST data
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));


app.get('/', (req, res) => {
  res.sendFile(path.join(__dirname, '../dist/index.html'));
});

// Point static path to dist
    app.use(express.static(path.join(__dirname, '../dist')));

// Set our api routes
    app.use('/routes', api);

// Catch all other routes and return the index file
app.get('*', (req, res) => {
    res.sendFile(path.join(__dirname, '../dist/index.html'));
});

/**
     * Get port from environment and store in Express.
 */
const port = process.env.PORT || '3000';
app.set('port', port);

/**
     * Create HTTP server.
 */
const server = http.createServer(app);

/**
 * Listen on provided port, on all network interfaces.
 */
server.listen(port, () => console.log(`API running on localhost:${port}`));
下面是我的api.js:

const express = require('express');
const router = express.Router();

router.post('/login', (req, res) => {
  console.log('Run');
});

module.exports = router;
以下是我的Angular2 service.ts:

import { Injectable } from '@angular/core';
import {Http, Response, Headers} from '@angular/http';
import { Observable } from 'rxjs';
import 'rxjs/add/operator/map';

@Injectable()
export class AuthService {

  constructor(private _http: Http) { }

      Login(email: string, password: string): Observable<Response> {
        let credentials = {
        _email: email,
        _password: password
      };
      return this._http.post('/api/login',{_uc:credentials}).map(
          (res: Response) => res.json()
      );
  }

}
从'@angular/core'导入{Injectable};
从'@angular/Http'导入{Http,Response,Headers};
从“rxjs”导入{Observable};
导入'rxjs/add/operator/map';
@可注射()
导出类身份验证服务{
构造函数(私有http:http){}
登录(电子邮件:string,密码:string):可观察{
让凭据={
_电邮:电邮,,
_密码:密码
};
返回此.http.post('/api/login',{uc:credentials}).map(
(res:Response)=>res.json()
);
}
}
问题:

当我点击我的表单提交按钮时,它会点击我的service.ts文件中的login方法,但不会在服务器端控制台上显示任何错误,也不会点击我的server api.js login post方法。我不知道为什么我的服务器端api.js登录post方法没有命中并且在控制台窗口中没有显示任何错误。请告诉我我的代码有什么错误。客户端代码是我在service.ts登录方法中放在控制台中的工作文件,它显示我的输出,但http请求在服务器端不工作。如果我的问题中需要任何其他细节,请告诉我

当我点击我的表单提交按钮时,它会点击我服务上的登录方法

你需要订阅一个可观察的,以便“激发”它

示例:
this.authService.Login(..).subscribe((res)=>console.log(res))

当我点击我的表单提交按钮时,它会点击我服务上的登录方法

你需要订阅一个可观察的,以便“激发”它


示例:
this.authService.Login(..).subscribe((res)=>console.log(res))

您正在将api.js安装在“/routes”(应用程序使用(“/routes”,api);
)的基本url处。因此,您可以通过“/routes/login”访问它


如果这不是您想要的,那么将其挂载在“/api”上,就像您的客户端代码所期望的那样。

您将在“/routes”的基本url上挂载api.js(
app.use(“/routes”,api);
)。因此,您可以通过“/routes/login”访问它


如果这不是您想要的,那么将它装载到“/api”上,就像您的客户端代码所期望的那样。

我认为这是您自己的错误,您是如何输入错误的

    app.use('/routes', api);
试着把它改成

    app.use('/api', api);
这肯定会奏效,以防你们要去大项目的理想方式路线应该是不同的文件夹

只需要输入所需的文件

server.js

const express = require('express');
const path = require('path');
const http = require('http');
const bodyParser = require('body-parser');
const mongoose = require('mongoose');
const session = require('express-session');
mongoose.connect("mongodb://localhost/demo");

const api = require('../server/routes/api');

const app = express();
app.use(session({
    secret: 'somesecrettokenhere',
    name: 'demo',
    resave: false,
    saveUninitialized: true
}));

// Parsers for POST data
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));


app.get('/', (req, res) => {
  res.sendFile(path.join(__dirname, '../dist/index.html'));
});

// Point static path to dist
    app.use(express.static(path.join(__dirname, '../dist')));

// Set our api routes
    app.use('/routes', api);

// Catch all other routes and return the index file
app.get('*', (req, res) => {
    res.sendFile(path.join(__dirname, '../dist/index.html'));
});

/**
     * Get port from environment and store in Express.
 */
const port = process.env.PORT || '3000';
app.set('port', port);

/**
     * Create HTTP server.
 */
const server = http.createServer(app);

/**
 * Listen on provided port, on all network interfaces.
 */
server.listen(port, () => console.log(`API running on localhost:${port}`));

如果您想修改路由命名约定,请查看一下

我认为这是您方面的一个错误,您是如何输入错误的

    app.use('/routes', api);
试着把它改成

    app.use('/api', api);
这肯定会奏效,以防你们要去大项目的理想方式路线应该是不同的文件夹

只需要输入所需的文件

server.js

const express = require('express');
const path = require('path');
const http = require('http');
const bodyParser = require('body-parser');
const mongoose = require('mongoose');
const session = require('express-session');
mongoose.connect("mongodb://localhost/demo");

const api = require('../server/routes/api');

const app = express();
app.use(session({
    secret: 'somesecrettokenhere',
    name: 'demo',
    resave: false,
    saveUninitialized: true
}));

// Parsers for POST data
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));


app.get('/', (req, res) => {
  res.sendFile(path.join(__dirname, '../dist/index.html'));
});

// Point static path to dist
    app.use(express.static(path.join(__dirname, '../dist')));

// Set our api routes
    app.use('/routes', api);

// Catch all other routes and return the index file
app.get('*', (req, res) => {
    res.sendFile(path.join(__dirname, '../dist/index.html'));
});

/**
     * Get port from environment and store in Express.
 */
const port = process.env.PORT || '3000';
app.set('port', port);

/**
     * Create HTTP server.
 */
const server = http.createServer(app);

/**
 * Listen on provided port, on all network interfaces.
 */
server.listen(port, () => console.log(`API running on localhost:${port}`));

如果你想修改路由命名约定,请看一下

你是对的,我忘记订阅我的登录方法,这就是为什么我没有收到404的任何错误。@Ahmeralahsan,正如mscdex所回答的,你的路径是错误的:-)但它没有引起我的注意:-)你是对的,我的朋友。这是我的第一个基本错误:-)你是对的,我忘记订阅我的登录方法,这就是为什么我没有收到404的任何错误。@AhmerAliAhsan,正如mscdex回答的,你的路径是错误的:-)但它没有引起我的注意:-)你是对的,我的朋友。这是我的第一个基本错误:-)mscdex和echonax答案解决了我的问题。感谢您的回答。mscdex和echonax的回答解决了我的问题。谢谢你的回答。