【发布时间】:2018-03-12 18:22:54
【问题描述】:
谁能帮我解决这个问题?我被困了2天,....我真的不知道如何解决它....我使用angular cli / angular5和expressjs构建了一个网页(包含一个表格)。我使用 mongoose mongodb 作为数据库。在本地一切正常。但是当我上传 dist 文件夹并将其部署到 azure web 应用程序时,它的表是空的。 错误日志如下所示:
HttpErrorResponse {headers: HttpHeaders, status: 200, statusText: "OK", url: "https://stringfr.azurewebsites.net/book", ok: false, …}
error:
error: SyntaxError: Unexpected token < in JSON at position 0 at JSON.parse
HttpHeaders {normalizedNames: Map(0), lazyUpdate: null, lazyInit: ƒ}
message: "Http failure during parsing for https://stringfr.azurewebsites.net/book"
name:"HttpErrorResponse"
ok:false
status:200
statusText:"OK"
这是我的临时网站:“https://stringfr.azurewebsites.net”。您可以通过检查检查完整的错误日志。
我认为这与 book.component.ts 中的这一行有关。 在这里,我从数据库中获取数据并在一个简单的 html 表上使用它。 注意 book_value 只是我获取更多结构化数据的接口。
this.http.get<book_value>('/book').subscribe (
data => this.books = data
);
这里是我初始化“/book”的地方。 在 app.js 中
var express = require('express');
var path = require('path');
var logger = require('morgan');
var bodyParser = require('body-parser');
var book = require('./routes/book');
var app = express();
var mongoose = require('mongoose');
mongoose.Promise = require('bluebird');
//mongoose.connect('put ur own mongodb')
// .then(() => console.log('connection succesful'))
//.catch((err) => console.error(err));
mongoose.connect('mongodb://localhost/mean-angular5')
.then(() => console.log('connection succesful'))
.catch((err) => console.error(err));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({'extended':'false'}));
app.use(express.static(path.join(__dirname, 'dist')));
app.use('/books', express.static(path.join(__dirname, 'dist')));
app.use('/book', book);
在 ./routes/book.js 中
var express = require('express');
var router = express.Router();
var mongoose = require('mongoose');
var Book = require('../models/Book.js');
/* GET ALL BOOKS */
router.get('/', function(req, res, next) {
Book.find(function (err, products) {
if (err) return next(err);
res.json(products);
console.log(products);
console.log("products info above");
console.log(res);
});
});
这是我在 ../models/Book.js 中的架构:
var mongoose = require('mongoose');
var BookSchema = new mongoose.Schema({
timestamp: String,
question : String,
answer : String
});
module.exports = mongoose.model('Book',BookSchema );
因为我使用的是 dist 文件夹。我使用这个 web.config。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="AngularJS" stopProcessing="true">
<match url="^(?!.*(.bundle.js|.bundle.map|.bundle.js.gz|.bundle.css|.bundle.css.gz|.png|.jpg|.ico|.svg|.eot|.woff|\.woff2)).*$" />
<conditions logicalGrouping="MatchAll"></conditions>
<action type="Rewrite" url="/" appendQueryString="true" />
</rule>
</rules>
</rewrite>
<staticContent>
<remove fileExtension=".svg" />
<remove fileExtension=".eot" />
<remove fileExtension=".woff" />
<remove fileExtension=".woff2" />
<mimeMap fileExtension=".svg" mimeType="image/svg+xml" />
<mimeMap fileExtension=".eot" mimeType="application/vnd.ms-fontobject" />
<mimeMap fileExtension=".woff" mimeType="application/font-woff" />
<mimeMap fileExtension=".woff2" mimeType="application/font-woff" />
</staticContent>
</system.webServer>
</configuration>
注意:Azure 日志流上没有显示错误。 这是我的 app.module:
const appRoutes: Routes = [
{
path: 'books',
component: BookComponent,
data: { title: 'Book List' }
},
{ path: '',
redirectTo: '/books',
pathMatch: 'full'
}
];
@NgModule({
declarations: [
AppComponent,
BookComponent,
],
imports: [
BrowserModule,
HttpClientModule,
CalendarModule,
BrowserAnimationsModule,
FormsModule,
AccordionModule,
PanelModule,
ButtonModule,
RadioButtonModule,
DataTableModule,
MultiSelectModule,
DropdownModule,
RouterModule.forRoot(
appRoutes,
{ enableTracing: true } // <-- debugging purposes only
)
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
【问题讨论】:
-
您的图书路线似乎无法访问。 stringfr.azurewebsites.net/book 不起作用。也许您拥有它,因此无法看到常规的 http 请求,但如果您这样做,出于故障排除的原因,您可能希望将其关闭。然后就可以看到json长什么样了。
-
实际上,如果您阅读错误,您会发现这不是 /book 返回的直接 json 字符串。它是一堆 HTML 和 JavaScript 之类的东西。这就是你的问题所在。
-
这和这个有关系吗:this.http.get
('/book').subscribe (data => this.books = data);因为这是我唯一使用“/book”的地方,所以“/book”正在处理获取请求以从数据库中获取所有图书数据。 -
还是dist文件夹有问题?
-
我不知道。我建议您检查以确保您的路线设置正确。这似乎是一个路由问题。尝试查看此文档。 angular.io/guide/router
标签: node.js express httpclient azure-web-app-service angular5