在节点项目本身内部调用端点?
Calling an endpoint inside the node project itself?
我正在创建一个 MERN 应用程序,它可以在没有 SSR 的情况下向 React 页面添加元标记。因此,我需要读取服务器主文件中的查询并将适当的元数据内容传递给每个页面。
我在 server.js 文件中使用它:
const indexPath = path.resolve(__dirname, 'build', 'index.html');
// static resources should just be served as they are
app.use(express.static(
path.resolve(__dirname, 'build'),
{ maxAge: '30d' },
));
// here we serve the index.html page
app.get('/*', (req, res, next) => {
fs.readFile(indexPath, 'utf8', (err, htmlData) => {
if (err) {
console.error('Error during file reading', err);
return res.status(404).end()
}
// get post info
const postId = req.query.id;
const post = getPostById(postId);
if(!post) return res.status(404).send("Post not found");
// inject meta tags
htmlData = htmlData.replace(
"<title>React App</title>",
`<title>${post.title}</title>`
)
.replace('__META_OG_TITLE__', post.title)
.replace('__META_OG_DESCRIPTION__', post.description)
.replace('__META_DESCRIPTION__', post.description)
.replace('__META_OG_IMAGE__', post.thumbnail)
return res.send(htmlData);
});
});
这里的getPostById
是在文件中静态定义的。但我想从我的数据库中获取它。
我的文件结构是:
server.js
controllers
- posts.js
routes
- posts.js
我把逻辑和路由分开了。所以我的 routes/posts.js 文件看起来像:
import { getPost, createPost } from '../controllers/posts.js';
const router = express.Router();
router.get('/', getPost);
router.post('/', createPost);
export default router;
因此,为了动态传递元内容,我需要为每个请求读取 API 端点并传递适当的数据。为此,我需要直接在我的节点项目中调用端点。怎么做?
如有任何帮助,我将不胜感激。谢谢。
如果您真的想调用自己的 http 端点,您可以使用 http.get() or some higher level http library (that is a little easier to use) such as got()。然后,您可以向您自己的服务器发出 http 请求并取回结果。
但是...通常,您不会向自己的服务器发出http 请求。相反,您将获取所需数据的功能封装在一个函数中,然后在路由和您自己的代码中使用该函数,这些代码需要与路由相同的数据。这比打包 http 请求、将该请求发送到 TCP 堆栈、让该请求返回到您的服务器、解析该请求、获取数据、将其形成为 http 响应、将该响应发送回请求者,解析该响应,然后使用数据。
相反,如果您有一个通用的共享函数,您只需调用该函数,从中获取结果(可能通过承诺),然后就完成了。您不需要将所有中间包装到 http request/response、解析、环回网络等中...
我正在创建一个 MERN 应用程序,它可以在没有 SSR 的情况下向 React 页面添加元标记。因此,我需要读取服务器主文件中的查询并将适当的元数据内容传递给每个页面。 我在 server.js 文件中使用它:
const indexPath = path.resolve(__dirname, 'build', 'index.html');
// static resources should just be served as they are
app.use(express.static(
path.resolve(__dirname, 'build'),
{ maxAge: '30d' },
));
// here we serve the index.html page
app.get('/*', (req, res, next) => {
fs.readFile(indexPath, 'utf8', (err, htmlData) => {
if (err) {
console.error('Error during file reading', err);
return res.status(404).end()
}
// get post info
const postId = req.query.id;
const post = getPostById(postId);
if(!post) return res.status(404).send("Post not found");
// inject meta tags
htmlData = htmlData.replace(
"<title>React App</title>",
`<title>${post.title}</title>`
)
.replace('__META_OG_TITLE__', post.title)
.replace('__META_OG_DESCRIPTION__', post.description)
.replace('__META_DESCRIPTION__', post.description)
.replace('__META_OG_IMAGE__', post.thumbnail)
return res.send(htmlData);
});
});
这里的getPostById
是在文件中静态定义的。但我想从我的数据库中获取它。
我的文件结构是:
server.js
controllers
- posts.js
routes
- posts.js
我把逻辑和路由分开了。所以我的 routes/posts.js 文件看起来像:
import { getPost, createPost } from '../controllers/posts.js';
const router = express.Router();
router.get('/', getPost);
router.post('/', createPost);
export default router;
因此,为了动态传递元内容,我需要为每个请求读取 API 端点并传递适当的数据。为此,我需要直接在我的节点项目中调用端点。怎么做?
如有任何帮助,我将不胜感激。谢谢。
如果您真的想调用自己的 http 端点,您可以使用 http.get() or some higher level http library (that is a little easier to use) such as got()。然后,您可以向您自己的服务器发出 http 请求并取回结果。
但是...通常,您不会向自己的服务器发出http 请求。相反,您将获取所需数据的功能封装在一个函数中,然后在路由和您自己的代码中使用该函数,这些代码需要与路由相同的数据。这比打包 http 请求、将该请求发送到 TCP 堆栈、让该请求返回到您的服务器、解析该请求、获取数据、将其形成为 http 响应、将该响应发送回请求者,解析该响应,然后使用数据。
相反,如果您有一个通用的共享函数,您只需调用该函数,从中获取结果(可能通过承诺),然后就完成了。您不需要将所有中间包装到 http request/response、解析、环回网络等中...