Response Helpers

redirect

编辑此页面

重定向到下一个路由。 当通过服务器 RPC(远程过程调用)执行时,重定向将通过服务器完成。 默认情况下,redirect() 的状态码是 302 - FOUND,也称为临时重定向。

其他有用的重定向状态码:

状态码描述
301永久移动
307临时重定向
308永久重定向

抛出重定向的一个常见用例是当用户未经身份验证需要被发送到登录页面或其他公共路由时。

/queries/get-user.ts
import { query, redirect } from "@solidjs/router";
import { getCurrentUser } from "../auth";
const getUser = query(() => {
const user = await getCurrentUser();
if (!user) throw redirect("/login");
return user;
}, "get-user")

单次执行的变更操作

当在服务器操作(Server Action)中使用 redirect 时,重定向将通过服务器完成。 响应值将自动发送目标路由的数据,避免后续再次请求加载目标路由的数据。

这在将用户重定向到变更操作完成后的不同路由时非常有用。

/actions/add-user.ts
import { action, redirect } from "@solidjs/router";
const addUser = action(async (user: User) => {
await postUser(user);
return redirect("/users");
});

addUser 操作将在用户被添加到数据库后将用户重定向到 /users 路由。 表单操作的响应将发送更新后的 /users 路由数据,开发者无需手动重新验证或重新加载。


Throw vs Return

throwreturn 都可以用来将用户重定向到不同的路由。 对于一般用途,推荐使用 throw,因为它会立即停止当前操作的执行并重定向用户。

当从嵌套方法返回时,父方法将继续执行,这可能导致意外行为。

TypeScript 签名

interface ResponseOptions & Omit<ResponseInit, "body"> {
revalidate?: string | string[];
} | number
function redirect(url: string, opts = 302): CustomResponse<never>;

ResponseOptions 扩展了原生 ResponseInit 接口的类型。

报告此页面问题