2017-12-16 7 views
0

mein ausdrücklicher/Knoten Backend-App und Frontend-App verwendet getrennt werden, der Back-End-Run auf localhost: 3000 und dem vorderen Ende App gestartet wurde mit ng auf localhost dienen und läuft: 4200expressJWT blockiert Öffentlichen Ordner, wie zu entsperren?

aber nachdem ich die App builded, und alle Frontend-Sachen wurden minimiert und in/public/folder abgelegt, beide laufen auf Port 3000. Ich bin mir ziemlich sicher, dass sie so arbeiten sollen. Da i expressJWT Middleware bin mit ohne Token einige meine Routen für die Besucher zu schützen, bin immer ich jetzt nicht autorisiert 401 beim Versuch, den Frontend-App im Browser zu erhalten ..... enter image description here

Als Bild Shows, ich kann aparent laden die index.html ohne Probleme, ich kann auch laden alle externen gehosteten Quellen wie Stiefel Riemen und jquery etc ... aber meine eigenen .js-Dateien ist 401. Ich denke, es ist wegen der expressJWT, aber ich bin mir nicht ganz sicher. Weiß jemand, was das Problem ist und wie man es löst?

Es könnte auch express sein, dass falsch konfiguriert ist? wie man sehen kann ich auf „ubnlock“ die öffentlichen Ordner wie so versucht:

app.use(expressJWT({secret: secret}).unless({path : 
['/','../public/*','/api/authenticate', '/api/register']})) 

voll express:

const express = require("express") 
const bodyParser = require("body-parser") 
const logger = require('morgan') 
const api = require("./api/api") 
const path = require('path') 
const secret = require('./models/secrets') 
const expressJWT = require('express-jwt') 
const cors = require('cors'); 

const app = express() 

app.set("json spaces", 2) 
app.use(logger("dev")) 
app.use(bodyParser.json()) 
app.use(bodyParser.urlencoded({ extended: false })) 

// CORS middleware 
app.use(cors()); 

app.use(expressJWT({secret: secret}).unless({path : ['/','../public/*','/api/authenticate', '/api/register']})) 

app.use("/api/", api) 

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

app.use(function (req, res, next) { 
    var err = new Error('Not Found') 
    err.status = 404 
    next(err) 
}) 

app.use(function (err, req, res, next) { 
    console.error(err.status) 
    res.status(err.status || 500) 
    res.json({ msg: err.message, status: err.status }) 
}) 

// Body Parser middleware 
app.use(bodyParser.json()); 

// Set static folder 
app.use(express.static(path.join(__dirname, 'public'))); 
//Call this to initialize mongoose 
function initMongoose(dbConnection) { 
    require("./db/mongooseConnect")(dbConnection) 
} 

app.initMongoose = initMongoose 

module.exports = app 
+0

auch vereinfachen Sie Ihre App-Ordnerstruktur. Ich denke, es hat ein Problem mit der Pfadauflösung und nicht mit jwt. – Robus

+0

Entschuldigung, was meinst du mit Vereinfachung meiner App-Ordnerstruktur? Wenn ich meine Zeile app.use (expressJWT .......) auskommentiere, kann ich die bundle.js Dateien erreichen. Zumindest werden sie 401 nicht unauthorized .. stattdessen wird ihr Inhalt durch den gleichen Inhalt wie der index.html ersetzt. Das führt zu einem unerwarteten Token-Fehler, weil der HTML-Code plötzlich in einer .js-Datei liegt ... Ich habe die Originaldateien im Öffentlichen Ordner überprüft, sie enthalten den korrekten JavaScript-Code. wirklich verwirrend –

+0

Im Allgemeinen sind diese Bundle-Dateien Webpack-Loader-Dateien und generiert, wenn Sie ng bauen. In größeren Projekten verarbeitet die webpack config den exklusiven Ordner "dist" mit allen Ressourcen und Seiten, auf die beim Lazy Loading zugegriffen werden kann. Auch wenn Sie zwei verschiedene Ports verwenden, müssen Sie die in index.html aufgelöste Base href angeben. In den meisten Fällen funktioniert '/'. aber meistens relativ zu Ihrer Ordnerstruktur. Wenn alles Ordnung ist Überprüfen Sie auch 'CORS' vielleicht Geheimnis ist nicht in der Lage, Header auf anderen Port zu übergeben. – Robus

Antwort

0

Ich bin nicht 100% sicher, aber ich denke, Sie Problem mit dieser Linie haben .

app.use(expressJWT({secret: secret}).unless({path : ['/','../public/*','/api/authenticate', '/api/register']})) 

app.use("/api/", api)` 

Versuchen Sie es. Putting single / sollte lösen.

app.use('/api',expressJwt({secret: secret}).unless({path: ['/','/public/*','/api/authenticate', '/api/register']}); 
Verwandte Themen