Router. express () -> Как правильно выразить router.use? - PullRequest
0 голосов
/ 22 апреля 2020

Для router.use он больше не работает так:

router.use("/api", apiRoutes);

Вместо этого выдается ошибка: throw new typeerror ('router.use () требует функцию промежуточного программного обеспечения, но получил a '+ gettype (fn))

Как переопределить это выражение, чтобы оно работало? Я не нашел никаких примеров, которые были бы полезны до сих пор. Вот мой пример кода:

маршрутов / индекс. js (это не работает)

const path = require("path");
const router = require("express").Router();
const apiRoutes = require("./api");

// API Routes
router.use("/api", apiRoutes);**// this throws an error**
router.use(function(req, res) {
res.sendFile(path.join(__dirname, "../client/build/index.html"));
 });

module.exports = router;

Вот пример моей попытки изменить назначение, но я делаю не думаю, что это правильно:

var path = require("path");
var router = require("express").Router();
var apiRoutes = require("./api");

//API Routes
//authRouter.use(require('./authenticate').basic(usersdb))
//router.use("./api", apiRoutes);
console.log("Hitting API routes...")
router.use("./api", function(req, res, next) { **//re-purpsose attempt here**
   res.send(apiRoutes)
   console.log("API Routes:", apiRoutes)
   next()
});
console.log("API Routes hit")
// //If no API routes are hit, send the React app
//    router.use(function(req, res) {
//    res.sendFile(path.join(__dirname, "../client/public/index.html"));
//    });

module.exports = router

Это общая ошибка, которую я получаю (возвращено 404): GET / api / website_1_function_call / scrape 404 4,004 мс - 173

Я знаю, что это может быть связано с чем-то косвенным, но я действительно не уверен в части router.use.

Я точно знаю, что маршруты не проверяются должным образом и хотел бы исправить.

Любой совет будет принят во внимание. Заранее спасибо.

Вот еще код:

сервер. js

require("dotenv").config();

var express = require("express");
var cors = require('cors');
var bodyParser = require('body-parser');
var logger = require("morgan");
//const mongoose = require("mongoose");
var db = require("./models")
var routes = require("./routes");
var app = express();
var PORT = process.env.PORT || 3001;
var path = require('path');
//Define middleware here
app.use(express.urlencoded({ extended: true }));
app.use(express.json());
app.use(bodyParser.json());
//Serve up static assets (usually on heroku)
if (process.env.NODE_ENV === 'production') {
    app.use(express.static("client/build"));
}
app.use(cors());
app.use(logger("dev"));
//Add routes, both API and view
app.use(routes);
//replaced with below:
//app.use(app.router);
//routes.initialize(app);

// //Connect to the Mongo DB 
// mongoose.connect(process.env.MONGODB_URI || "mongodb://localhost/kaibru");

var syncOptions = { force: false };
// If running a test, set syncOptions.force to true
// clearing the `testdb`
if (process.env.NODE_ENV === "test") {
    syncOptions.force = true;
};

// Starting the server, syncing our models ------------------------------------/
db.sequelize.sync(syncOptions).then(function() {
    app.listen(PORT, function() {
      console.log(
        "==> ?  Listening on port %s. Visit http://localhost:%s/ in your browser.",
        PORT,
        PORT
      );
    });
  });

// //Start the API server
// app.listen(PORT, function() {
//     console.log(`? ==> API Server now listening on PORT ${PORT}!`);
// });

маршруты / индекс. js

var path = require("path");
var router = require("express").Router();
var apiRoutes = require("./api");

//API Routes
//authRouter.use(require('./authenticate').basic(usersdb))
//router.use("/api", apiRoutes);
console.log("Hitting API routes...")
router.use("/api", function(req, res, next) { // this is my re-purpose 
attempt
    apiRoutes
    console.log("API Routes:", apiRoutes)
//    next()
 }); // this is my r-purpose attempt
console.log("API Routes hit")
// //If no API routes are hit, send the React app
//    router.use(function(req, res) {
//    res.sendFile(path.join(__dirname, "../client/public/index.html"));
//    });

module.exports = router

маршрутов / API / индекс. js

var router = require("express").Router();
require("./website_1");
var website_1Routes = require("./website_1_function_call");
//const userRoutes = require("./user");

//Website_1 routes
//http://localhost:3000/api/website_1_function_call/scrape

//authRouter.use(require('./authenticate').basic(usersdb))
//router.use("/website_1_function_call", website_1Routes);
//experimental use
 router.use("/website_1_function_call", function(req, res, next) { // this is my re-purpose attempt
     website_1Routes
     console.log("website_1Routes:", website_1Routes)
//     next()
 }); //this is my re-purpose attempt
//router.use("/user", userRoutes); 

module.exports = router

маршрутов / API / website_1_function_call. js

require("./website_1");
require("./website_1_db");
require("./website_1_router");

//Call scrape functions from website_1 file
mainscrape();

//specificScrape() //let's leave this one dormant for now

//Now for saving to database
saveToDatabase();

//Now for the routes
routing();

Я думаю, моя попытка повторного назначения сработала (я удалил следующий () поскольку сразу после этого нет определенных маршрутов). Вроде бы обработка. Однако, теперь мой ответ зависает, и это происходит:

GET /api/website_1_function_call/scrape - - ms - -

Это печатает в консоли браузера:

GET http://localhost:3000/api/website_1_function_call/scrape 
net::ERR_EMPTY_RESPONSE

0.chunk.js:871 Uncaught (in promise) Error: Network Error
    at createError (0.chunk.js:871)
    at XMLHttpRequest.handleError (0.chunk.js:366)

Так что теперь я думаю, что мой код скребка и мой код для обновления базы данных делают не работает.

Код функции очистки:

//var express = require("express");
var router = require("express").Router();
require("../../controllers/website_1controller");
//requiring this website's models
var Items_1 = require("../../models/website_1");
//require("./website_1_db");
//require("./website_1_router");

// Our scraping tools
// Axios is a promised-based http library, similar to jQuery's Ajax method
// It works on the client and on the server

var axios = require("axios");
var cheerio = require("cheerio");

mainscrape = function()  {
//Now to configure the routes
router.get("/scrape", function(req, res) {
//instead of simple res.render, user router.get  
console.log("scraping started...");
//Grab the html body with axios    
axios.get("url placeholder").then(function(response) {
//Load to cheerio and save to $ selector
    console.log("Scraping all greenheartshop mainpage...");
    var $ = cheerio.load(response.data);
    var output = [];
    var promises = [];

//Now we need to grab the title reference for each article
$("article").each(function(i, element) {

//save empty result object
var result = {};

//thumbnail
result.thumbnail = $(this)
//.children("article.product-grid-item.product-block").html()
.children("figure.product-item-thumbnail")
.children("a")
.attr("href")
//console.log("result thumbnail")
//console.log(result)
console.log(result.thumbnail)

var result = {}
//details
result.detail= $(this)
//.children("product-item-mask").html()
.children("div.product-item-details")
// .children("div.product-item-brand")
// .children("h5.product-item-title")
// .children("a")
// .children("div.product-item-price")
//.children("product-price-line")
//.children("price-value")
.text()
//result.detail = result.detail.trim();
//console.log("result detail")
//console.log(result)
console.log(result.detail)

//Capture the scraped data and save to database
console.log("Capturing Scrape")
if(result.detail !== '') {
    var promise = Items_1
    .saveToDatabase(result, result, {upsert:true, new:true})
    console.log("saveToDatabase");
    promises.push(promise);
}
Promise.all(promises).then((data) => {
    res.json(data);
});
//saveToDatabase();

// if (result.thumbnail !== {} && result.detail !== "") {
//     var promise = Items_1
//     // .items_1_create({
//     //     resultThumbnail: result.thumbnail,
//     //     resultDetails: result.detail  
//     //   })
//     promises.push(promise)
//     // .then(dbModel => output.push(dbModel));
//     Promise.all(promises).then((data) => {
//       res.json(data)
//     })
//   }


});
});
//Now to CREATE the results using controller file
// console.log("creating items in the database now...")
// router.post('/scrape', website_1Controller.items_1_create);
//Now to display the results
// console.log("Items now being displayed...")
// router.get('/scrape/display', website_1Controller.items_1_list)
});
}
module.exports = router;
module.exports = mainscrape;
module.exports = specificScrape;

Код для обновления базы данных:

require("../../controllers/website_1controller");
require("./website_1");
var Items_1 = require( "../../models");

//After scraping the main page, the following function is to save to the 
database

saveToDatabase = function() {
    //prepare the data
    var result = {}
    var dataToStore = Items_1.items_1_create
    console.log(dataToStore)
    //console.log(items_1_create)
    //insert data to the database
    // dataToStore.save().// We will not sue this part for now
    //     then(() => {
    //         console.log("Data successfully saved");
    //     }).catch(err => {
    //         console.log("Error: ", err);
    //     });
}

module.exports = saveToDatabase;

Код для окончательной маршрутизации (после завершения очистки)

var website_1Controller = require("../../controllers/website_1controller");
var router = require("express").Router();

routing = function() {
//Now to CREATE the results using controller file
 console.log("creating items in the database now...")
 //router.route("/browse")
 router.post('/browse', website_1Controller.items_1_create);
 router.get('/browse', website_1Controller.items_1_list);

//Now to display the results
 console.log("Items now being displayed...")
 //router.route("/browse:search")
 router.get('/:search', website_1Controller.items_1_specific);
};
require("./website_1");
module.exports = routing;
module.exports = router;

модели

'use strict';
// Dependencies
// =============================================================

// Sequelize (capital) references the standard library
//var Sequelize = require("sequelize");
// sequelize (lowercase) references our connection to the DB.
//var sequelize = require("../config/connection.js");
// Creates a "Items_1" model that matches up with DB
module.exports = function(sequelize, DataTypes) {
  var Items_1 = sequelize.define("Items_1", {
  // the routeName gets saved as a string
  detail: DataTypes.STRING,
  // the name of the character (a string)
  thumbnail: DataTypes.BLOB,
  // the character's role (a string)
  //role: Sequelize.STRING,
  // the character's age (a string)
  //age: Sequelize.INTEGER,

  // and the character's force points (an int)
  //forcePoints: Sequelize.INTEGER
}, {
  // disable the modification of tablenames; By default, sequelize will 
   automatically
  // transform all passed model names (first parameter of define) into 
   plural.
  // if you don't want that, set the following
  freezeTableName: true
});

return Items_1;
//Syncs with DB
//Items_1.sync();

// Makes the Items_1 Model available for other files (will also create a table)
};

контроллер

// *********************************************************************************
// website_1controllers.js - this file offers a set of routes for displaying and saving data to the db
// *********************************************************************************

// Dependencies
// =============================================================
var db = require("../models");

//display results for mainpage scrape
exports.items_1_create = function(req, res) {

      db.Items_1.findOneAndUpdate(req.body, req.body, {upsert: true, new: 
       true})
      .then(dbModel => res.json(dbModel))
      .catch(err => res.status(422).json(err))
      console.log("findOneAndUpdate complete")
 },

 exports.items_1_list = function(req,res) {
   db.Items_1.findAll({})
 },

 exports.items_1_specific = function(req,res) {
   db.Items_1.findById(req.params.search)
 },

function(err, results) {
  if (err) { return next(err); } //Error in API usage.
  if (results.result.thumbnail==={} && results.result.detail==="") {//No 
     Results.
    var err = new Error('Results not found');
    err.status = 404;
    return next(err)
  }
  //Successful, so render
  res.render("click_results", { title: 'Click Results', resultThumbnail: 
  result.thumbnail, resultDetails: result.detail });

}

Таким образом, новая проблема заключается в том, что ответ зависает. Я думаю, это потому, что код для обновления базы данных не работает (с помощью sequelize). Дайте мне знать, если что-нибудь еще понадобится, и заранее благодарю.

1 Ответ

0 голосов
/ 25 апреля 2020

Спасибо всем за вход. После просмотра я обнаружил, что сама функция не должна быть переопределена, как я изначально думал ... Я не знал, что, если, например, вы используете "router.use (" / directoy ", directory) и вы используете его последовательно, чтобы указывать на разные каталоги, у последнего попадания в каталог должен быть определенный маршрут, такой как router.get (). Я модулировал свой код до точки, где конечный каталог был просто списком функций (одна из этих у функций был метод router.get). Это не сработало. Когда я указываю файл непосредственно на код, содержащий метод router.get, мои очищенные данные возвращаются в терминал. Просто подумал, что поделюсь своими выводами хотя бы потому, что я я вообще этого не знал. Большое спасибо @ mehta-rohan и @Anand Undavia за понимание. Я все еще пытаюсь получить данные для рендеринга на страницу, но это совсем другая проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...