Ошибка при получении: Uncaught (в обещании): Ответ со статусом: 404 Не найдено для URL: - PullRequest
0 голосов
/ 07 мая 2018

Я делаю запрос к конечной точке, написанный на koa.js, и я новичок в этой среде. API возвращает ответ 404.

Файл маршрута выглядит следующим образом:

const collabRepo = require("../repo/collab/collab-repo")
const notificationRepo = require("../repo/collab/notification-repo")
const rest = require("restling")
const jwt = require("jsonwebtoken")
const CONFIG = require("config")
const SECRET = CONFIG.get("auth.jwt.secret")
const JWT_COOKIE_NAME = CONFIG.get("auth.jwt.cookie.name")
const TOKENTIME = CONFIG.get("auth.jwt.ttl")
const FEED_API_BASE = CONFIG.get("urls.activityFeedApi")
const FEED_API_VERSION = "v1"
const FEED_API = FEED_API_BASE + "/" + FEED_API_VERSION
const logger = require("winston")
const { jwtAuth } = require("../auth")

const PROTECTED_ROUTES = [
    "/collab/follow",
    "/collab/unfollow",
    "/collab/follower/list",
    "/collab/follower/public/list",
    "/collab/following/list",
    "/collab/following/public/list",
    "/collab/following/count",
    "/collab/following",
    "/collab/notify",
    "/collab/discover/people",
    "/collab/discover/expression"
]

async function followFeed(toFollowId, userObject, follow) {
    const args = {
        data: {
            follow: {
                class: "user",
                id: toFollowId
            }
        },
        headers: {
            "Content-Type": "application/x-www-form-urlencoded",
            "Cookie": JWT_COOKIE_NAME + "=" + jwt.sign(userObject, SECRET, {
                expiresIn: TOKENTIME
            })
        }
    }
    if (follow) {
        return rest.post(FEED_API + '/follow', args)
    }
    return rest.post(FEED_API + '/unfollow', args)
}

когда я регистрирую rest.post (FEED_API + '/ follow', args), я получаю:

Promise {_bitField: 0, _fulfillmentHandler0: undefined,
_rejectionHandler0: undefined, _progressHandler0: undefined, _promise0: undefined, _receiver0: undefined, _settledValue: undefined} Необработанный отказ Ошибка: Cannot POST http://localhost/activity-feed/api/v1/follow по запросу. (\ Node_modules \ Рестлинг \ restling.js: 26: 21) в Request.emit (events.js: 180: 13) at Request._fireSuccess (\ node_modules \ restler \ lib \ restler.js: 223: 12) в \ node_modules \ restler \ lib \ restler.js: 161: 20 в IncomingMessage.auto (\ node_modules \ restler \ lib \ restler.js: 402: 7) в Request._encode (\ node_modules \ restler \ lib \ restler.js: 198: 29) в \ node_modules \ restler \ lib \ restler.js: 157: 16 в Request._decode (\ node_modules \ restler \ lib \ restler.js: 173: 7) на входящем сообщении. (\ Node_modules \ restler \ Lib \ restler.js: 150: 14) на IncomingMessage.emit (events.js: 185: 15) в endReadableNT (_stream_readable.js: 1106: 12) at process._tickCallback (internal / process / next_tick.js: 178: 19)

module.exports = (router) => {
    // Protect the marked routes
    PROTECTED_ROUTES.forEach(url => {
        router.use(url, jwtAuth)
    })
    // router.use("/collab", jwtAuth)

    router.post("/collab/follow", async function (ctx) {
        try {
            const resp = await followFeed(ctx.request.body.followee_id, ctx.state.user, true)
            return collabRepo.follow(ctx.state.user.id, ctx.request.body.followee_type, ctx.request.body.followee_id)
                .then(data => {
                    ctx.body = {
                        data: data,
                        feed_data: resp.data
                    }
                })
        } catch (error) {
            return error
        }
    }),

} // end of the module

Я удалил дополнительный код, который не относится к этому вопросу.

Функции, вызываемые по маршруту:

Функция followFeed

async function followFeed(toFollowId, userObject, follow) {
    const args = {
        data: {
            follow: {
                class: "user",
                id: toFollowId
            }
        },
        headers: {
            "Content-Type": "application/x-www-form-urlencoded",
            "Cookie": JWT_COOKIE_NAME + "=" + jwt.sign(userObject, SECRET, {
                expiresIn: TOKENTIME
            })
        }
    }
    if (follow) {
        return rest.post(FEED_API + '/follow', args)
    }
    return rest.post(FEED_API + '/unfollow', args)
}

Функция следует

 follow: function(user_id, followee_type, followee_id) {
        return db("follower").returning("followee_id").insert({ "user_id": user_id, "followee_id": followee_id, "followee_type": followee_type })
            .then(data => {
                return data[0]
            })
    },

Request

Может кто-нибудь помочь мне и сказать, что не так с моим кодом? Я вошел в систему, и у сеанса есть JWT, маршрут существует тогда, почему я получаю 404? Что не так с кодом в бэкэнде?

В консоли браузера я получаю:

Ошибка: Uncaught (в обещании): Ответ со статусом: 404 Not Found for URL

Это то, что я получаю, когда печатаю console.log(rest.post(FEED_API + '/follow', args))

Promise {
  _bitField: 0,
  _fulfillmentHandler0: undefined,
  _rejectionHandler0: undefined,
  _progressHandler0: undefined,
  _promise0: undefined,
  _receiver0: undefined,
  _settledValue: undefined }
Unhandled rejection Error: Cannot POST http://localhost/activity-feed/api/v1/follow
    at Request.<anonymous> (projectpath\node_modules\restling\restling.js:26:21)

Обновление

Ниже приведен маршрут подачи активности:

router.post("/v1/follow", function(ctx) {
    const user = ctx.state.user
    const request = ctx.request.body
    return feedRepo.followUserFeed(user.id, request.follow)
        .then(result => {
            ctx.body = result
        })
        .catch(error => {
            ctx.error = error
        })
})

Функция, вызываемая внутри этого маршрута

followUserFeed: async function(id, feed) {
    const userFeed = new GSFlatFeed(LOOKUP.FEEDS.USER, id)
    const feedToFollow = new GSFlatFeed(feed.class, feed.id)
    const res = await StreamProvider.followFeed(userFeed, feedToFollow)
    return res
},

app.js Activity-Feed / API

const Koa = require("koa")
const Router = require("koa-router")
const body = require("koa-body")
const cors = require("kcors")
const passport = require("koa-passport")
const logger = require("winston")
var JwtStrategy = require("passport-jwt").Strategy
const CONFIG = require("config")
const SECRET = CONFIG.get("auth.jwt.secret")
const JWT_COOKIE_NAME = CONFIG.get("auth.jwt.cookie.name")

const allRoutes = require("./server/routes/all-routes")

const app = new Koa()
const router = new Router()
const jwtAuth = passport.authenticate(["jwt"], { session: false })

passport.use(new JwtStrategy({
        secretOrKey: SECRET,
        jwtFromRequest: function(req) {
            var token = null
            if (req && req.cookies) {
                token = req.cookies.get(JWT_COOKIE_NAME)
            }
            return token
        }
    },
    function(jwt_payload, done) {
        done(null, jwt_payload)
    }))

router.use("/v1/*", jwtAuth)

allRoutes(router)

app.use(async(ctx, next) => {
    try {
        await next()
    } catch (err) {
        logger.error(err)
        ctx.throw(err.status || 500, err.message)
    }
})
app.use(cors())
app.use(passport.initialize())
app.use(body())
app
    .use(router.routes())
    .use(router.allowedMethods())

module.exports = app

Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 07 мая 2018

При регистрации маршрутов вы пропустили FEED_API (базовый URL).

PROTECTED_ROUTES.forEach(url => {
   router.use(url, jwtAuth)
})

То есть ваш URL выглядит как http://localhost/collab/follow вместо http://localhost/activity-feed/api/v1/follow

Вместо этого вы должны зарегистрировать свои маршруты как,

// Protect the marked routes
module.exports = (router) => {
   // Protect the marked routes
   PROTECTED_ROUTES.forEach(url => {
       router.use(FEED_API  + url, jwtAuth)
   })
   // router.use("/collab", jwtAuth)

   router.post(FEED_API + "/collab/follow", async function (ctx) {

Теперь вы можете отправлять / коллабировать / следовать как http://localhost/activity-feed/api/v1/collab/follow

...