2017-10-06 1 views
0

Je suis un réactionnaire/redux/mongoose/passeport noob. Je suppose qu'il devrait renvoyer la réponse à travers axios et à la page de réaction, mais il semble que ce n'est pas ce qui se passe.Impossible de déchiffrer l'erreur avec précision: TypeError: le chemin doit être absolu ou spécifier root à res.sendFile at ServerResponse.sendFile

Je reçois cette erreur vraiment étrange qui est similaire à la question trouvée à this link.

GET /robots.txt 500 6.666 ms - 2143 
TypeError: path must be absolute or specify root to res.sendFile 
at ServerResponse.sendFile (/Users/eric/Documents/todobuild/node_modules/express/lib/response.js:421:11) 
at /Users/eric/Documents/todobuild/server.js:40:12 
at Layer.handle [as handle_request] (/Users/eric/Documents/todobuild/node_modules/express/lib/router/layer.js:95:5) 
at next (/Users/eric/Documents/todobuild/node_modules/express/lib/router/route.js:137:13) 
at Route.dispatch (/Users/eric/Documents/todobuild/node_modules/express/lib/router/route.js:112:3) 
at Layer.handle [as handle_request] (/Users/eric/Documents/todobuild/node_modules/express/lib/router/layer.js:95:5) 
at /Users/eric/Documents/todobuild/node_modules/express/lib/router/index.js:281:22 
at param (/Users/eric/Documents/todobuild/node_modules/express/lib/router/index.js:354:14) 
at param (/Users/eric/Documents/todobuild/node_modules/express/lib/router/index.js:365:14) 
at Function.process_params (/Users/eric/Documents/todobuild/node_modules/express/lib/router/index.js:410:3) 
at next (/Users/eric/Documents/todobuild/node_modules/express/lib/router/index.js:275:10) 
at SessionStrategy.strategy.pass (/Users/eric/Documents/todobuild/node_modules/passport/lib/middleware/authenticate.js:338:9) 
at SessionStrategy.authenticate (/Users/eric/Documents/todobuild/node_modules/passport/lib/strategies/session.js:75:10) 
at attempt (/Users/eric/Documents/todobuild/node_modules/passport/lib/middleware/authenticate.js:361:16) 
at authenticate (/Users/eric/Documents/todobuild/node_modules/passport/lib/middleware/authenticate.js:362:7) 
at Layer.handle [as handle_request] (/Users/eric/Documents/todobuild/node_modules/express/lib/router/layer.js:95:5) 

D'après ce que je comprends, la différence entre nos situations est qu'ils obtiennent l'erreur lors du démarrage de leur serveur de nœud, mais le mien commence bien. Ce n'est qu'après avoir configuré ma première demande d'API que j'ai commencé à avoir ce problème.

Le script problème est la suivante:

const mongoose = require('mongoose'); 
const passport = require('passport'); 
const User = require('../../models/user.js'); 

module.exports = function(app) { 

app.post('/api/login', function(request, response) { 
    User.findOne({ email: request.body.email }) 
    .then(function(data) { 
     if (data.email) { 
     passport.authenticate('local')(request, response,() => { 
      if (request.user) { 
      return response.send(JSON.stringify(request.user)); 
      } 
     }); 
     } 

     return response.send(JSON.stringify({ error: 'There was an error logging in.'})); 
    }) 
    .catch(error => console.log(error)); 
}); 

Voici aussi mon fichier server.js pour faire bonne mesure.

const path = require('path'); 
const express = require('express'); 
const logger = require('morgan'); 
const bodyParser = require('body-parser'); 
const mongoose = require('mongoose'); 
const passport = require('passport'); 
const LocalStrategy = require('passport-local').Strategy; 
const expressSession = require('express-session')({ 
    secret: 'some random string', 
    resave: false, 
    saveUninitialized: false 
}); 

const app = express(); 
const PORT = process.env.PORT || 3000; 

mongoose.connect('mongodb://localhost/todo', {useMongoClient: true 
}); 
const db = mongoose.connection; 
//models 
const User = require('./models/user'); 

app.use(express.static(path.join(__dirname, './public'))); 
app.use(logger('dev')); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: false })); 
app.use(bodyParser.text()); 
app.use(bodyParser.json({ type: 'application/vnd.api+json' })); 
app.use(expressSession); 
app.use(passport.initialize()); 
app.use(passport.session()); 

passport.use(new LocalStrategy(User.authenticate())); 
passport.serializeUser(User.serializeUser()); 
passport.deserializeUser(User.deserializeUser()); 

//routes 
require('./routes/api/api-routes.js')(app); 

app.get('*', function(request, response) { 
    response.sendFile('index.html'); 
}); 

db.on('error', function(error) { 
    console.log('Mongoose Error: ', error); 
}); 

db.once('open', function() { 
    console.log('Mongoose connection successful.'); 
}); 

app.listen(PORT, 'localhost', function() { 
    console.log('App running on port 3000'); 
}); 

dépendances

"dependencies": { 
    "axios": "^0.16.2", 
    "babel-core": "^6.26.0", 
    "babel-loader": "^7.1.2", 
    "babel-preset-env": "^1.6.0", 
    "babel-preset-es2015": "^6.24.1", 
    "babel-preset-import-export": "^1.0.2", 
    "babel-preset-react": "^6.24.1", 
    "babel-preset-stage-2": "^6.24.1", 
    "body-parser": "^1.18.2", 
    "express": "^4.16.1", 
    "express-session": "^1.15.6", 
    "history": "^4.7.2", 
    "mongoose": "^4.12.0", 
    "morgan": "^1.9.0", 
    "passport": "^0.4.0", 
    "passport-local": "^1.0.0", 
    "passport-local-mongoose": "^4.2.1", 
    "react": "^16.0.0", 
    "react-dom": "^16.0.0", 
    "react-redux": "^5.0.6", 
    "react-router": "^4.2.0", 
    "react-router-dom": "^4.2.2", 
    "react-router-redux": "^4.0.8", 
    "redux": "^3.7.2", 
    "webpack": "^3.6.0" 
    } 

Encore une fois, je suis désolé pour mon ignorance. :(

Répondre

1

La trace de la pile dit ceci:

at /Users/eric/Documents/todobuild/server.js:40:12

Le problème est la ligne 40 dans server.js Une supposition suggère que la ligne 40 est cette ligne.

response.sendFile('index.html'); 

Docs pour sendFile sont ici:

https://expressjs.com/en/4x/api.html#res.sendFile

L'élément clé est que vous utilisez le chemin de fichier relatif index.html mais sendFile a besoin d'un chemin absolu, par exemple:

response.sendFile(path.join(__dirname, 'index.html'));