Javascript angular 5和node.js express产品构建问题
当我尝试对angular和node.js项目进行生产构建时,遇到了一个问题。 当我使用命令Javascript angular 5和node.js express产品构建问题,javascript,node.js,angular,Javascript,Node.js,Angular,当我尝试对angular和node.js项目进行生产构建时,遇到了一个问题。 当我使用命令ngserve运行angular项目,并使用nodemon server运行后端时,一切正常。但当我执行ngbuild--prod并修改后端以从“dist”中获取静态数据时。我没有得到应用程序的全部功能,我通常有一个注册页面和登录页面,但配置文件页面有问题。在这个页面上,应该显示用户的个人信息,但是在服务器的响应日期,我得到一个空的正文,状态是200 OK。 下面我引用我的代码摘录和inspector的截图
ngserve
运行angular项目,并使用nodemon server
运行后端时,一切正常。但当我执行ngbuild--prod
并修改后端以从“dist”中获取静态数据时。我没有得到应用程序的全部功能,我通常有一个注册页面和登录页面,但配置文件页面有问题。在这个页面上,应该显示用户的个人信息,但是在服务器的响应日期,我得到一个空的正文,状态是200 OK。
下面我引用我的代码摘录和inspector的截图。
请帮助了解问题所在。
如蒙指教,我将不胜感激
服务:
import {Injectable} from '@angular/core';
import {HttpClient, HttpErrorResponse} from '@angular/common/http';
import {Observable} from 'rxjs/Observable';
import {User} from './user';
@Injectable()
export class MntApiService {
private data: any = [];
private mntAPI = 'http://localhost:3000';
constructor( private _http: HttpClient ) {
}
getUsers(): Observable<any> {
return this._http.get<any>( this.mntAPI + '/users' );
}
addUser( user: User ): Observable<any> {
return this._http.post<any>( this.mntAPI + '/signup', user );
}
addEditUser( id, user: User ): Observable<any> {
return this._http.post<any>( this.mntAPI + '/profile/' + id, user );
}
getById( id: string ): Observable<any> {
return this._http.get( this.mntAPI + '/profile/' + id, {responseType: 'json'} )
.do( data => {
this.data = data;
console.log( data );
} )
.catch( this.handleError );
}
private handleError( err: HttpErrorResponse ) {
console.log( err );
return Observable.throw( err.message );
}
}
node.js文件users.js
router.get('/profile/:id', (req, res) => {
const id = req.params.id;
console.log(id);
let sql = 'SELECT * FROM users WHERE id = ?';
config.query(sql, id, (err, user) => {
console.log(user);
if (err) {
res.status(500).json({
message: err
});
return;
} else {
res.status(200).json({
user: user
});
}
});
});
mypackage.json
"dependencies": {
"@angular/animations": "^5.2.0",
"@angular/common": "^5.2.0",
"@angular/compiler": "^5.2.0",
"@angular/core": "^5.2.0",
"@angular/forms": "^5.2.0",
"@angular/http": "^5.2.0",
"@angular/platform-browser": "^5.2.0",
"@angular/platform-browser-dynamic": "^5.2.0",
"@angular/router": "^5.2.0",
"@auth0/angular-jwt": "^2.0.0",
"@nguniversal/express-engine": "^6.0.0",
"@types/jwt-decode": "^2.2.1",
"@types/moment": "^2.13.0",
"bcrypt": "^2.0.0",
"body-parser": "^1.18.2",
"bootstrap": "^4.0.0",
"core-js": "^2.4.1",
"dotenv": "^5.0.1",
"express": "^4.16.3",
"font-awesome": "^4.7.0",
"jquery": "^3.3.1",
"jsonwebtoken": "^8.2.1",
"jwt-decode": "^2.2.0",
"moment": "^2.22.1",
"morgan": "^1.9.0",
"mysql": "^2.15.0",
"ngx-slick": "^0.1.3",
"node-mysql": "^0.4.2",
"rxjs": "^6.1.0",
"rxjs-compat": "^6.1.0",
"script-loader": "^0.7.2",
"slick-carousel": "^1.8.1",
"zone.js": "^0.8.19"
},
"devDependencies": {
"@angular/cli": "~1.7.2",
"@angular/compiler-cli": "^5.2.0",
"@angular/language-service": "^5.2.0",
"@types/jasmine": "~2.8.3",
"@types/jasminewd2": "~2.0.2",
"@types/node": "~6.0.60",
"codelyzer": "^4.0.1",
"jasmine-core": "~2.8.0",
"jasmine-spec-reporter": "~4.2.1",
"karma": "~2.0.0",
"karma-chrome-launcher": "~2.2.0",
"karma-coverage-istanbul-reporter": "^1.2.1",
"karma-jasmine": "~1.1.0",
"karma-jasmine-html-reporter": "^0.2.2",
"nodemon": "^1.17.3",
"protractor": "~5.1.2",
"ts-node": "~4.1.0",
"tslint": "~5.9.1",
"typescript": "~2.5.3"
}
}
app.js
const express = require('express');
const app = express();
const morgan = require('morgan');
const bodyParser = require('body-parser');
const path = require('path');
const usersRoutes = require('./api/routes/users');
app.use(morgan('dev'));
app.use(express.static(path.join(__dirname, 'dist')));
app.get('*', (req, res ) => {
res.sendFile(path.join(__dirname, 'dist/index.html'));
});
app.use(bodyParser.urlencoded({
extended: true
}));
app.use(bodyParser.json());
app.use((req, res, next) => {
res.Header('Content-Type', 'application/json');
res.header('Access-Control-Allow-Origin', '*');
res.header(
'Access-Control-Allow-Headers',
'Origin, X-Requested-With, Content-Type, Accept, Authorization'
);
if (req.method === 'OPTIONS') {
res.Header('Content-Type', 'application/json');
res.header('Access-Control-Allow-Methods', 'PUT, POST, PATCH, DELETE, GET');
return res.status(200).json({});
}
next();
});
app.use('/', usersRoutes);
app.use((req, res, next) => {
const error = new Error('Not found');
error.status = 404;
next(error);
});
app.use((error, req, res, next) => {
console.log(error);
res.status(error.status || 500);
res.json({
error: {
message: error.message
}
});
});
module.exports = app;
和截图:
如上所述,您的应用程序正在从服务器接收html响应(错误消息和文本内容)。第二个屏幕截图证实了这一点(在响应标题部分,显示内容类型:text/html) 一个快速修复方法是在发送到服务器的请求头中指定response
Accept:text/html
。如下所示:
import { Injectable } from "@angular/core";
import { HttpClient, HttpHeaders } from "@angular/common/http";
import { Observable } from "rxjs";
@Injectable()
export class YOURService{
headers = new HttpHeaders({
"Accept": "text/html" // <-- add this
});
constructor(private _http: HttpClient) {}
getUsers(): Observable<any> {
return this._http.get<any>( this.mntAPI + '/users', {headers: this.headers} );
}
}
在第一个屏幕截图中,错误表示您正在从服务器接收html响应(错误消息
和文本内容)。第二个屏幕截图确认了这一点(在response header
部分,它说Content-Type:text/html
。您好,谢谢您的回答,但是没有帮助,这是相同的错误,请求正文是空的。问题是,我的服务器以json格式发送数据,我不明白为什么标题中的答案是text/html格式。我试图在c中找到错误onsole在[link]router.get('/profile/:id',(req,res)=>{console.log('hello world');[link]行之后至少有一个简单的“hello world”;[link],但它不会打印到控制台,尽管响应正确[link]get/profile/24200 1.276 ms-681[link]。但是在回答我的“hello world”之后@sugarmecan您可以在node.js服务器上执行某些操作:res.setHeader('Content-Type','application/json');和res.send(json.stringify({user:user}));并且不设置“Accept”:“text/html”在你的Angular应用程序中。同样没有帮助,上面我在问题描述中添加了文件代码app.js。这让我很难过,为什么服务器没有以正确的格式发送数据。如果这有帮助的话,我可以给git项目存储库提供链接。仅通过个人消息。请随时向我发送pm。这里没有个人消息,请告诉我您的联系信息,例如电子邮件给我
import { Injectable } from "@angular/core";
import { HttpClient, HttpHeaders } from "@angular/common/http";
import { Observable } from "rxjs";
@Injectable()
export class YOURService{
headers = new HttpHeaders({
"Accept": "text/html" // <-- add this
});
constructor(private _http: HttpClient) {}
getUsers(): Observable<any> {
return this._http.get<any>( this.mntAPI + '/users', {headers: this.headers} );
}
}
router.get('/profile/:id', (req, res) => {
const id = req.params.id;
console.log(id);
let sql = 'SELECT * FROM users WHERE id = ?';
config.query(sql, id, (err, user) => {
console.log(user);
res.setHeader('Content-Type', 'application/json'); // <-- set header here
if (err) {
res.status(500).send(JSON.stringify({
message: err
}));
} else {
res.status(200).send(JSON.stringify({ // <-- send JSON data here
user: user
}));
}
});
});
const express = require('express');
const app = express();
const morgan = require('morgan');
const bodyParser = require('body-parser');
const path = require('path');
const usersRoutes = require('./api/routes/users');
app.use(morgan('dev'));
app.use(express.static(path.join(__dirname, 'dist')));
// ======= This should be removed ========================
// app.get('*', (req, res) => {
// res.sendFile(path.join(__dirname, 'dist/index.html'));
// });
// =======================================================
app.use(bodyParser.urlencoded({extended : true}));
app.use(bodyParser.json());
app.use((req, res, next) => {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Headers',
'Origin, X-Requested-With, Content-Type, Accept, Authorization');
if (req.method === 'OPTIONS') {
res.header('Access-Control-Allow-Methods', 'PUT, POST, PATCH, DELETE, GET');
return res.status(200).json({});
}
next();
});
app.use('/', usersRoutes);
app.use((req, res, next) => {
const error = new Error('Not found');
error.status = 404;
next(error);
});
app.use((error, req, res, next) => {
console.log(error);
res.status(error.status || 500);
res.json({error : {message : error.message}});
});
module.exports = app;